繁体   English   中英

指针数组初始化

[英]Array of pointers initialization

 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循环内引发错误。 此分配有什么问题吗? 本质上,我想存储长度为2的16个字符串。我也尝试过使用指针数组(char * arr [16])。 我尝试使用malloc()和calloc()在双指针初始化中寻找资源,但找不到很多。 如果您可以指出一些链接,将不胜感激。 谢谢。

您需要为16个指针分配内存,而不仅仅是一个。

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

您的代码会发生什么情况,就是arr仅对一个指针具有足够的内存,因此arr[0] = <something>是正确的,但是arr[1]及更高版本会触及不属于该程序的内存。

此外,分配字符串指针的方法是错误的。 您要分配0或1个值,具体取决于callocNULL的结果。 您需要在其中添加括号:

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);
    }
}

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

不要转换'calloc'的结果。

在为内存分配函数计算大小时,避免使用sizeof(<type>) 最好改用sizeof *<pointer>

如果要存储长度为2的小节,则需要至少3个字符长的缓冲区(对于零终止符,需要额外的字符)。

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

if条件缺失括号, if您分配给arr[i] 操作关联不正确。 它不会按原样编译。

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)在大多数情况下不是一个好主意。

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语句中检查括号。 您的代码是否可以编译?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM