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

时间:2010-01-24 17:55:11

标签: 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);
    length=strlen(string);
    sptr[i]=malloc(sizeof(char)*length);
    sptr[i]=string;
}

sptr是数组,我将访问输出字符串。 所以这是一个指针数组,然后指向单个字符串(或其他字符数组,如果你更愿意这样想的话)。

让我们说有两个字符串。 我为两个指针分配内存, 然后在第一个指针,我扫描一个字符串, 我找到了弦的长度, 我分配内存大小的字符串 我等于指向字符串的指针。 这一切都很有用,如果我在最后一行之后放一个printf(),它就会起作用。 我面临的问题是,如果让我们说有3个字符串,每次通过sptr [i]被正确分配,但是在那个块之外,sptr的所有指标都是=我输入的最后一个字符串,而我不明白为什么。

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

4 个答案:

答案 0 :(得分:2)

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

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

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

发生错误是因为您将指针设置为指向字符串变量。

答案 1 :(得分:1)

您需要为null终止符分配1个字符:

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

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

strcpy(sptr[i], string);

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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