【发布时间】:2012-08-10 05:07:59
【问题描述】:
我最近决定复习我的 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 指针,然后分配每个指针所需的实际大小。只是感觉不对。
再一次,我可能对所有这一切都错了,在这种情况下:随意将我的头撞到墙上,并指出我应该在浪费你所有时间之前阅读一本体面的手册的方向.. .
【问题讨论】:
-
aStr[i] = (char *) calloc(j,sizeof(char));不是sizeof(char *) -
@Gir,我是这么想的,奇怪的是,两者都编译得很好,没有发出警告
-
所以?我并不是说它是正确的。它不会抱怨,因为 a)您将两个结果都转换为正确的类型 b)它不知道您想做什么。我什至不确定你需要投射
-
@Gir:
sizeof(char)根据定义为 1,您不应该强制转换。所以应该只有aStr[i] = calloc(j, 1);。 -
sizeof(char) 可能更具可读性
标签: c string malloc calloc dynamic-allocation