2013-12-17 117 views
2

我想填充一个字符串数组使用两个函数:第一,如果我有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

这是不行的'char * help =“”;' – this

+0

为了扩大这个范围:当你调用'scanf(“%s”,help)',那么'help'必须指向一个足够大的内存位置以保存正在读入的字符串。 –

+1

您不需要在C中输入'malloc'的结果。 – dasblinkenlight

回答

0

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

变化char* help=" ";char help[512]="";

这种方式帮助指向一个字符串(恒定存储在存储器块,这是不允许被改变。

+0

工作原理:D 非常感谢 –

+1

@ user3104033:请注意,输入超过511个字符会使程序再次失败,因为分配的内存将被覆盖,并且会出现未定义的行为, – alk

0

fill()应该只需要char * *,我认为你会得到一个运算符优先级问题。

由于您不需要重新分配fill()中的数组,所以没有必要具有三个间接级别。您应该将其更改为两个,当然也可以在没有&的情况下调用。

+0

正如你告诉我的,我接受了char **,并且改变了char * help =“”;给char aide [] =“”; 现在程序要求我输入所有字符串,但是在写入最后一个字符串后出现这个问题:“围绕变量”助手“堆栈已损坏” –

+0

如果't'被声明为'char ** t'并且他将这个变量的地址作为'fill(&t,n)'传递,那么声明'char *** t'是非常正确的。我同意,尽管在这里发布的代码中似乎没有必要增加额外的间接级别,并且如果't'没有被重新分配,那么删除不必要的重定向级别是有意义的。 –

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