申请内存
-
二维字符串数组:char **res=calloc(res_size,sizeof(char*))
-
几种申请的区别,malloc/calloc/realloc
-
void* malloc(int n);//直接申请n大小的内存,且不进行初始化 void* calloc(int n,int size);//申请的是n*size 的内存,且进行初始化,即置0 void* realloc(void* p,int n);//p是已经指向堆内的一个指针,根据其指向空间与所需要的n对比,看是扩大还是缩小。他也不进行初始化 void free(void* ptr);//释放指针。 对于malloc和realloc,如果要进行初始化,需要使用memset void *memset(void *s, int v, size_t n);//s是一个指针,也可以是数组名;v是要填充的值;n是要填充的数量。
-
一维数组就没啥好说的,可以用上边的方法申请内存,也可以char temp[40];
-
字符数组或者申请内存肯定是较大的,当结束后在末尾加‘\0’作为字符串,再利用strcpy(res[i],temp),就可以把temp这个一维字符数组构成的字符串放到res的第i个数组里。strcpy的两个参数都是char*指针
-
要弄清楚sizeof和strlen的区别。sizeof常用于calloc分配内存和memset初始化。
char *cur=source[i]; int length=strlen(cur);//求长度 emp[temp_pos]='\0'; res[res_pos]=calloc(temp_pos+1,sizeof(char));//求分配大小 strcpy(res[res_pos],temp);
-
memset没那么简单,
1. struct data { char num[100]; char name[100]; int n; }; struct data a, b[10]; memset( &a, 0, sizeof(a) ); //注意第一个参数是指针类型,a不是指针变量,要加& memset( b, 0, sizeof(b) ); //b是数组名,就是指针类型,不需要加& 2. 我们用memset给str初始化为“00000000”,用法如下 char str[9]; memset(str,0,8); 注意,memset是逐字节拷贝的。 3. int num[8]; 我们用memset给str初始化为{1,1,1,1,1,1,1,1}, memset(num,1,8);//这样是不对的 一个int是4个字节的,8个int是32个字节,所以首先要赋值的长度就不应该为8而是32。 因为memset是逐字节拷贝,以num为首地址的8字节空间都被赋值为1, 即一个int变为0X00000001 00000001 00000001 00000001,显然,把这个数化为十进制不会等于1的。 !!!所以,在memset使用时要千万小心,在给char以外的数组赋值时,只能初始化为0或者-1。
-
errno_t memset_s(void *s, rsize_t smax, int c, rsize_t n),跟memset相比,多了第二个参数,代表能设置的最大值,一般是设置和第四个参数n相同。
-
在函数外边写的int res=0是不会进行初始化的,在函数内部还要再写一次res=0。调了1一个小时才找到
-
int nums[2][3]={{0,1},{2,0},{3,1}};这是初始化一个二维数组,传入时传的是int** nums,但用的时候还得转换一下,int(*grid)[numsSize] =(int*)nums;其中numsSize是他的行数,列可以不管。此时才能使用grid【i】【j】去实现调用。
-
sizeof只能用于自己刚定义的内容,引用传过来的都不行,这也是为什么传数组的时候都要传大小。一个例外是传char *的时候,因为可以通过\0来判断长度,所以可以用strlen(char* c )这个api来算长度。
-
出现XXX找不到,是因为访问了无法确定的错误,因为设置的数组过大了,访问到别的地方去了。