【问题标题】:Array Elements Overwritten with Last in C在 C 中用 Last 覆盖的数组元素
【发布时间】:2010-01-24 17:55:10
【问题描述】:

我正在尝试创建一个程序,该程序接受一组字符串(要求用户输入他们将输入的字符串数),一旦有了这些字符串,它们就会被放置在一个数组中,使用动态内存。

输出会是这样的:

# of Strings: 3
Cat
Dog
Elephant 

Cat
Dog
Elephant

这是我的代码的 sn-p,在我得到字符串数量之后。

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 的索引都是 = 到我输入的最后一个字符串,我不知道为什么。

如果您能帮助我,我将不胜感激。谢谢。

【问题讨论】:

  • 答案暗示,'sptr[i]=string;'分配指针,而不是它指向的内存。如果您重用相同的内存来读取字符串,那么数组的每个元素将指向内存中的相同位置,因此它们将打印相同的字符串。更喜欢 srtncpy 而不是 strcpy,不太容易将字符串复制到较小的缓冲区并导致内存溢出。希望这会有所帮助。
  • 谢谢,这完美地澄清了事情。我将使用 strcpy 只是因为它是我们在课堂上使用的。我正在考虑完全回答这个问题。伙计,我喜欢这个社区。​​span>

标签: c arrays memory dynamic malloc


【解决方案1】:
sptr=malloc(sizeof(char*)*nStrings);

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

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

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

【讨论】:

  • 您是否可以扩展您的答案?我确实设法让它工作,但是我不知道 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);你没有工作的原因是通过将变量 string 分配给 sptr[i] 你确实将指向 string 的指针分配给了 sptr 数组单元格。所以你所做的就是让 sptr 的每个单元格都指向字符串。但是因为每次迭代后字符串的内容都会发生变化,所以退出循环后所有变量的内容都相同,也就是你读到的最后一个字符串。
【解决方案2】:

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

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

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

strcpy(sptr[i], string);

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-03
        • 2021-04-17
        • 2019-10-04
        • 2012-08-11
        • 2016-01-21
        • 1970-01-01
        • 1970-01-01
        • 2018-11-19
        相关资源
        最近更新 更多