我最近决定复习我的 C 知识(我只剩下一点点)。我很快意识到,第一个变得模糊的技能是内存管理。该死的。
我决定最好的办法是写一些毫无意义的指针练习。第一个是分配一个由 4 个字符数组组成的数组,每个字符数组的长度都是可变的。
该代码的简化版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char **aStr = malloc(4*sizeof(aStr));
int j = 0;
int i = 0;
while(i<sizeof(aStr))
{
j = 4 + 2*i;//in my code, length is determined by arguments
aStr[i] = malloc(j*sizeof(aStr[i]));
j--;
strncpy(aStr[i],"RaisinRubarbCarrot"+i,j);
aStr[i][j] = 0;//just a habbit
j++;
printf("ptr@:%p\n\tkey:%d\n\tval:%s\n\tlength:%d (%d)\n\n",*aStr[i],i,aStr[i],j,strlen(aStr[i]));
i++;
}
free(aStr);
return 0;
}
我觉得这很笨拙,而且违反直觉。今天我想起了我的宿敌:calloc
. 然后我写了
char **aStr = (char **)calloc(4, sizeof(char *));
并在循环中:
aStr[i] = (char *) calloc(j,sizeof(char *));
我找到了这样写最后一行的代码示例:
aStr[i] = (char *) calloc(j,sizeof(char));//without the asterisk
问题1:有什么区别,如果有的话?
问题2:难道没有另一种分配字符串数组的方法吗?我现在看到代码的方式,感觉/看起来我首先将 4 个指针分配给单个 char 指针,然后分配每个指针所需的实际大小。只是感觉不对。
再说一次,我可能对所有这一切都错了,在这种情况下:随意将我的头撞在墙上,并指出我应该阅读一本体面的手册的方向,然后再浪费你所有的时间......