很多字符串在用strcpy拷贝时会报错或者直接赋值时会出现乱码,都是因为没有初始化。
char *str = (char *)malloc(sizeof(char));
memset(str,0,sizeof(char));即可
有时在编译时并不知道数组的长度,可以这样动态分配数组
- size = get_size();
- int *p = new int[n];
- for(int *q=p;q!=p+n;++q)
- ...
- delete []p;
一个自定义结构体的初始化
MYSTUCT mystr;
memset(&mystr,0,sizeof(mystr));
和下面皆可
MYSTUCT *mystr;
memset(mystr,0,sizeof(*mystr));
如果是二维的数组,在初始化时能否直接将声明的二维数组的数组名传递给一个指针呢?编译后就会发现是有问题的,一维数组的数组名即为指向该数组的指针,该指针值保存了数组存放在内存中的一块连续区域的起始地址,所以数组的下标就表示了这片内存区域的某存储区相对于起始地址的偏移量;而二维数组在概念上远比一维数组复杂,或者说二维数组以一种晦涩的方式构建在一维数组之上。
之前在C++博客里看见过一篇文章,记了一点笔记如下:
事实上,计算机系统的多维数组其实最终还是以一维数组的形式实现的。就N x M的二维数组来讲,设其数组名为array。指针array指向一个数组,该数组存放的是一系列指针,这些指针分别指向相应的一维数组,而这些数组中存放的才是我们的数据。
array -> [一维数组指针1] -> [ 一维数组,M长]
[一维数组指针2] -> [ 一维数组,M长]
…… ……
[一维数组指针N] -> [ 一维数组,M长]
由此可见array是第i个指针变量地址,array[j]则表示相对于第i个指针变量偏移 j*sizeof(数组类型)。
系统通过这种机制访问了该N*M维数组的第i行,第j列的内容。
所以,对于一个二维数组MYSTUCT mystr[N][M],就需要用数组指针或二维指针来表示了。
初始化的方法有两种
MYSTRUCT **des = malloc(N*sizeof(MYSTRUCT*));
for(int i = 0;i<N;i++)
des[i] = malloc(M*sizeof(MYSTRUCT));
下面这个例子是两个一维指针对二维数组的操作
- void double_div()
- {
- int score[3][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};
- int *p1,*p2;
- int i;
- for(p1=*score;p1<=*(score+2);p1=p1+4)/* score+i终究还是地址 */
- {
- for(p2=p1;p2<p1+4;p2++)
- {
- if(*p2<60)
- {
- for(i=0;i<4;i++)
- {
- printf("%d ",*(p1+i));
- }
- printf("/n");
- }
- }
- }
- }
初始化之后的内存拷贝就简单多了,利用函数memcpy,对象指针必须初始化。另外,通过内存拷贝对数据类型没有约束,这也是下面一片文章说的CString转char*能用CT2A宏的方法,如果用strcpy或直接=赋值都无法达到效果。
- float a = 3.12;
- float b = 0.0;
- void *data;
- data = malloc(sizeof(float));//4
- memcpy(data,&a,sizeof(float));
- memcpy(&b,data,sizeof(float));