指针数组初始化

时间:2009-10-18 15:36:16

标签: c pointers

 char **arr;
 arr = (char **)calloc(1,sizeof(char*));

 for(i = 0; i< 16; i++)
    if(arr[i] = (char *)calloc(1, 2*sizeof(char)) == NULL)
        perror("Memory cannot be allocated to arr[i]", %d);

当我尝试将内存分配给arr [i]时,上面的代码在for循环中抛出一个错误。这个分配有什么问题。本质上,我想存储16个长度为2的字符串。我也尝试过使用指针数组(char * arr [16])。我尝试使用malloc()和calloc()查找双指针初始化的资源,但找不到很多。如果你能指出一些链接,那将非常感激。 感谢。

4 个答案:

答案 0 :(得分:8)

你需要为16个指针分配足够的内存,而不仅仅是一个。

arr = (char **)calloc(16, sizeof(char*));

您的代码会发生什么arr只有一个指针有足够的内存,所以arr[0] = <something>是正确的,但是arr[1]和更高的内存是触及不属于程序

此外,分配字符串指针的方式是错误的。您要分配0或1个值,具体取决于calloc的结果是NULL。你需要在那里添加括号:

if ((arr[i] = (char *)calloc(1, 2*sizeof(char))) == NULL)
    perror("Memory cannot be allocated to arr[%d]", i);

更好:

for(i = 0; i < 16; i++) {
    arr[i] = (char *)calloc(1, 2*sizeof(char));
    if (arr[i] == NULL) {
        perror("Memory cannot be allocated to arr[%d]", i);
    }
}

答案 1 :(得分:4)

使用calloc时,通常使用第一个参数传递数组中的元素数,第二个参数传递元素的大小。因此,要分配一个包含16个指针的数组,通常会使用calloc(16, <pointer size>),而不是calloc(1, 16 * <pointer size>),尽管两者都做同样的事情。在您的代码中,您显然完全忘记了16并且只分配了1个指针。

不要施放'calloc'的结果。

在计算内存分配函数的大小时,请避免使用sizeof(<type>)。更喜欢使用sizeof *<pointer>

如果你想存储长度为2的srings,你需要一个至少3个字符长的缓冲区(零终结符的额外字符)。

内存分配失败通常不会设置errno,因此perror不适合在此处使用。

您在arr[i]条件下对if的分配缺少大括号。操作关联不正确。它不会按原样编译。

char **arr; 
arr = calloc(16, sizeof *arr); 
for(i = 0; i < 16; i++)
    if((arr[i] = calloc(3, sizeof *arr[i]) == NULL)
        fprintf(stderr, "Memory cannot be allocated");

最后,一个未命名的“魔法常数”(16和3)大部分时间都不是一个好主意。

答案 2 :(得分:2)

arr = (char **)calloc(1,sizeof(char*));

分配一个指向char的指针。

  

基本上,我想存储16个长度为2的字符串

char **arr = calloc(16, sizeof *arr);

if (!arr) exit(-1); /* bail out somehow */

for(i = 0; i < 16; i++)
  if((arr[i] = calloc(2, sizeof *arr[ i ])) == NULL)
    printf("Memory cannot be allocated to arr[ %d ]", i + 1);

if条件和printf语句中检查括号。你的代码甚至可以编译吗?

答案 3 :(得分:1)

直接存储两个字符比存储指针要便宜,所以我建议删除一个间接级别并使用一个连续的内存块:

char (*arr)[2] = calloc(16, sizeof *arr); 

另请注意,您的字符序列不能是字符串,因为您没有为终止0提供内存。