将内存分配给字符串数组

时间:2013-12-17 18:55:17

标签: c arrays string memory-management

我想用两个函数填充一个字符串数组:第一个,如果我有n个字符串要分配,将分配n个内存空间;第二个将为每个读取的字符串分配内存

这是第一个功能:

char** allocate(int n)
{
    char** t;
    t=(char**)malloc(n*sizeof(char*));
    if(!t) exit(-1);
    return t;
}

这是第二个:

void fill(char*** t,int n)
    {
        int i;
        char* help=" ";
        for(i=0;i<n;i++)
        {
            printf("\n saisir la chaine n %d :",i+1);
                scanf("%s",help);
                *t[i]=(char*)malloc((strlen(help)+1)*sizeof(char));
                strcpy(*t[i],help);
        }
    }

我没有忘记像main这样拨打第二个:fill(&t,n);

问题是我在读完第一个字符串并且程序结束后收到错误。

3 个答案:

答案 0 :(得分:2)

这一行

char* help=" ";

只定义一个指向" "的指针。

没有分配内存然后通过scanf()存储要扫描的数据。

如果要扫描的字符数最多,请执行以下操作:

#define SCAN_MAXIMUM (255)
#define SCAN_FMT_STRINGIFY(max) "%"#max"s"
#define SCAN_FMT(max) SCAN_FMT_STRINGIFY(max)

...

  char help[SCAN_MAXIMUM + 1]; /* Add one for the road^H^H^H^H`0`-terminator. */
  scanf(SCAN_FMT(SCAN_MAXIMUM), help);

这些行也不是你想要的:

    *t[i]=(char*)malloc((strlen(help)+1)*sizeof(char));
    strcpy(*t[i],help);

[]运算符绑定比*运算符更紧密,因此行应该看起来像

    (*t)[i] = malloc((strlen(help) + 1));
    strcpy((*t)[i], help);

同样^ 2:C中不需要投射malloc/calloc/realloc的结果,也不需要推荐它。


同样^ 3:sizeof(char)被定义为等于1

答案 1 :(得分:0)

fill()应该采用char * *,我认为您会遇到运算符优先级问题。

由于您不需要在fill()内重新分配数组,因此没有必要有三个间接级别。你应该把它改成只有两个,当然不用&来打电话。

答案 2 :(得分:0)

问题是你没有为帮助变量分配内存。

char* help=" ";更改为char help[512]="";

这种方式帮助指向一个字符串文字(常量存储在内存块中,不允许更改。

相关问题