2010-01-24 51 views
0

我试图创建一个程序,它接收一组字符串(用户被要求输入它们将输入的字符串的数量),一旦它有这些字符串,它们被放置在一个数组中,使用动态内存。用C中最后一个覆盖的数组元素

的输出中会是这样的:

# 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是数组,我将访问以输出字符串。 所以它是一个指向数组的指针数组,指向单个字符串(或其他字符数组,如果您希望这样想)。

可以说有两个字符串。 我分配内存的两个指针, 然后在第一个指针,我扫描一个字符串, 我发现字符串的长度, 我分配内存的字符串的大小 和我等于指向字符串的指针。 这一切都很花哨,如果我在最后一行之后放一个printf(),它就会起作用。 我面对的问题是,如果让我们说有3个字符串,每次通过sptr [i]分配正确,但在该块之外,所有sptr的指示都是=我放入的最后一个字符串,并且我不知道为什么。

如果你能帮助我,我会很感激。谢谢。

+1

正如答案所暗示的,'sptr [i] = string;'分配指针,而不是它指向的内存。如果您重复使用相同的内存来读取字符串,那么数组中的每个元素都将指向内存中的相同位置,因此它们将打印相同的字符串。更喜欢strcpy的srtncpy,不太容易将一个字符串复制到一个较小的缓冲区并获得一个内存溢出。希望这可以帮助。 – 2010-01-24 18:11:02

+0

谢谢,这完美澄清了事情。如果仅仅因为它是我们在课堂上使用的,我会使用strcpy。我正在考虑完全回答的问题。男人,我喜欢这个社区。 – Blackbinary 2010-01-24 18:40:57

回答

1

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

sptr[i]=malloc(sizeof(char)*(length+1)); 

此外,您还需要将字符串复制到新分配的内存:

strcpy(sptr[i], string); 
0

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

1

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

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

for(i=0;i<nStrings;i++) 
{ 
    scanf("%s",string); 
    sptr[i]=strdup(string); 
} 

我假设变量字符串有足够的内存来保持读取字符串。

由于您将指针设置为指向字符串变量,因此发生错误。

+0

您可以扩展您的答案吗?我设法让它工作,但是我不知道什么是strdup(或者需要库)。我用strcpy代替。问题是,我不明白为什么会导致错误。是不是sptr [我]被视为一个字符串?谢谢你的回答,但它确实有帮助。 – Blackbinary 2010-01-24 18:35:14

+0

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指向字符串。 但是由于字符串的内容在每次迭代后确实发生了变化,所以在退出循环后,所有变量都具有相同的内容,这是您读取的最后一个字符串。 – George 2010-01-24 20:27:52

相关问题