用C中的Last覆盖的数组元素

用C中的Last覆盖的数组元素,c,arrays,memory,dynamic,malloc,C,Arrays,Memory,Dynamic,Malloc,我试图创建一个程序,该程序接收一定数量的字符串(要求用户输入他们将输入的字符串数量),一旦有了这些字符串,就使用动态内存将它们放入数组中 输出应该是这样的: # of Strings: 3 Cat Dog Elephant Cat Dog Elephant 这里是我的代码片段,在我有了字符串数之后 sptr=malloc(sizeof(char*)*nStrings); for(i=0;i<nStrings;i++) { scanf("%s",string); le

我试图创建一个程序,该程序接收一定数量的字符串(要求用户输入他们将输入的字符串数量),一旦有了这些字符串,就使用动态内存将它们放入数组中

输出应该是这样的:

# of Strings: 3
Cat
Dog
Elephant 

Cat
Dog
Elephant
这里是我的代码片段,在我有了字符串数之后

sptr=malloc(sizeof(char*)*nStrings);

for(i=0;i<nStrings;i++)
{
    scanf("%s",string);
    length=strlen(string);
    sptr[i]=malloc(sizeof(char)*length);
    sptr[i]=string;
}
sptr=malloc(sizeof(char*)*nStrings);

对于(i=0;istrlen不考虑零终止,您需要添加一个。但主要需要将字符串复制到您分配的内存中。

strlen不考虑零终止,您需要添加一个。但主要需要将字符串复制到您分配的内存中。

您需要为t额外分配一个字符他是一个空终结者:

sptr[i]=malloc(sizeof(char)*(length+1));
此外,还需要将字符串复制到新分配的内存中:

strcpy(sptr[i], string);

您需要为空终止符额外分配1个字符:

sptr[i]=malloc(sizeof(char)*(length+1));
此外,还需要将字符串复制到新分配的内存中:

strcpy(sptr[i], string);

代码中有两个问题:分配的内存不足。由于字符串结尾为\0,因此长度应为+1。其次,应使用strcpy将字符串复制到分配的内存中。查找处理这两个问题的strdup函数。

代码中有两个问题:分配的内存不足。长度应为+1因为字符串的结尾是\0。其次,您应该使用strcpy将字符串复制到分配的内存中。查找处理这两个字符串的strdup函数。

sptr=malloc(sizeof(char*)*nStrings);
sptr=malloc(sizeof(char*)*nStrings);

for(i=0;i<nStrings;i++)
{
    scanf("%s",string);
    sptr[i]=strdup(string);
}
对于(i=0;i
sptr=malloc(sizeof(char*)*nStrings);

对于(i=0;iAs),答案暗示,'sptr[i]=string;'分配指针,而不是指针指向的内存。如果您正在重用相同的内存来读取其中的字符串,那么数组的每个元素都将指向内存中的相同位置,因此它们将打印相同的字符串。与strcpy相比,更喜欢srtncpy,将字符串复制到较小的缓冲区并导致内存溢出不那么容易。希望这有所帮助。而不是ks,这很好地澄清了问题。我打算使用strcpy,因为这是我们在课堂上使用的。我认为这个问题已经完全回答了。伙计,我爱这个社区。正如答案所暗示的,'sptr[I]=string;'分配指针,而不是指针指向的内存。如果您正在重用相同的内存来读取其中的字符串,那么数组的每个元素都将指向内存中的相同位置,因此它们将打印相同的字符串。与strcpy相比,更喜欢srtncpy,将字符串复制到较小的缓冲区并导致内存溢出不那么容易。希望这有所帮助。而不是ks,这很好地澄清了问题。我打算使用strcpy,因为它是我们在课堂上使用的。我正在考虑完全回答这个问题。伙计,我喜欢这个社区。你能扩展你的答案吗?我确实成功地让它工作了,但我不知道strdpy是什么(或所需的库)。我改为使用strcpy。问题是,我不明白这为什么会导致错误。sptr[I]不是被视为字符串吗?谢谢你的回答,它确实有帮助。strdup是在string中定义的。h函数原型:char*strdup(const char*s);语句sptr[I]=strdup(string);相当于sptr[I]=malloc(sizeof(char)*(strlen)(string)+1);strcpy(sptr[i],string);您没有工作的原因是将变量string赋值给sptr[i]您确实将指向字符串的指针分配给了sptr数组单元格。因此,您所做的是使sptr的每个单元格都指向字符串。但是,由于字符串的内容在每次迭代后都会发生变化,因此在退出循环后,所有变量都具有相同的内容,这是您读取的最后一个字符串。您是否可以扩展您的答案?我没有这样做但是,我不知道什么是strdup(或所需的库)。我改用strcpy。问题是,我不明白这为什么会导致错误。sptr[I]不是被视为字符串吗?谢谢你的回答,它确实有帮助。strdup是在string中定义的。h函数原型:char*strdup(const char*s);语句sptr[i]=strdup(string);相当于sptr[i]=malloc(sizeof(char)*(strlen(string)+1));strcpy(sptr[i],string);您没有工作的原因是将变量字符串赋给sptr[i]您确实将指向字符串的指针分配给了sptr数组单元格。因此,您所做的是使sptr的每个单元格都指向字符串。但由于字符串的内容在每次迭代后都会发生变化,因此在退出循环后,所有变量都具有相同的内容,这是您读取的最后一个字符串。