【问题标题】:Allocate 2D char array malloc or calloc分配二维字符数组 malloc 或 calloc
【发布时间】: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


【解决方案1】:

char *char 是两种不同的类型,具有不同的数据大小。 char 总是一个字节,所以sizeof(char) 总是 1。另一方面,指向 char 的指针在 32 位系统上将是 4 个字节。因此,如果您使用sizeof(char*) 为字符串分配空间,您分配的空间将远远超出您的需要。

使用循环分配单个字符串很好。假设您的字符串有一个最大长度,您可以只分配一个大块,但这会很笨拙。

【讨论】:

  • 那么这两种方法中哪一种更适合呢? callocmalloc,因为在这两种情况下,代码都做同样的事情。我目前正在使用calloc,因为它更符合 IMO 的目标
  • calloc 为您将数据元素初始化为零,因此可以防止某些错误。否则它们是等效的:只需使用您认为读得更好的那个。但如果您使用malloc,请注意内存没有初始化为任何内容,并且会被垃圾数据填充。
【解决方案2】:
  1. 您应该使用 sizeof(char) 而不是 sizeof(char*) 因为您尝试为字符数组而不是字符指针数组分配内存。所以这是正确的版本:

    aStr[i] = (char*) calloc(j, sizeof(char)); 
    //first argument number of memory
    //locations to be allocated
    //second argument, size of each location
    

    calloc 与 malloc 的区别/优势在于它还将内存位置初始化为 0。

  2. 首先分配一个包含 4 个字符的指针的数组。然后,为每个字符串分配内存(之前分配的 4 个指针中的每一个都将指向这些数组之一)

【讨论】:

  • sizeof(char) == 1 不过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
相关资源
最近更新 更多