为什么不将地址传递给指针数组来存储该唯一值?

问题描述 投票:0回答:3

我正在尝试创建一个指针数组来保存各种大小的字符串。我想提示用户输入,将值存储在数组中,然后使用以下代码打印它们:

#include <stdio.h>

int main() {

    char *string_array[10];

    for (int x = 0; x < 2; x++)
    {
        char string[50];
        printf("Input Name of Fruit number %d\n", x);
        fgets(string, 50, stdin);
        string_array[x] = string;
    }

    for (int x = 0; x < 2; x++)
    {
        printf("%s\n", string_array[x]);
    }
    return 0;
}

我希望这段代码接受两个用户提示并存储每个字符串的地址。但是,当我运行代码时,最终用户提示表示存储在指针数组中每个地址的值。检查了一下,发现这是因为每个地址都是一样的。

我认为这是因为

string
变量每次都被实例化到相同的地址,或者尽管在每个 for 循环中都定义了,但从未更改过。阻止此代码工作的地址在这里发生了什么?

arrays c pointers memory-address
3个回答
2
投票
for (int x = 0; x < 2; x++)
{
        char string[50];
        printf("Input Name of Fruit number %d\n", x);
        fgets(string, 50, stdin);
        string_array[x] = string;
}

这个循环中的数组

string
具有块作用域。当块结束时它不复存在。所以
string_array[0]
string_array[1]
将指向不再存在的内存,并且访问该内存将调用未定义的行为。

  1. 对象有一个生命周期,超过它们就不能被访问。

  2. 在其生命周期之外引用一个对象没有定义 行为。

  3. 自动变量有对应执行的生命周期 他们的定义块。


修复

正如@Weather Vane 评论的那样:

你正在存储同一个缓冲区的相同地址,但是当你 报告字符串,该缓冲区已超出范围。你可以做什么 是复制:

string_array[x] = strdup(string);

另一种解决方案是使用

malloc()
分配内存并使用标准
strcpy()
。如果输入超过块的原始长度,稍后可以使用
realloc()
调整内存大小。


0
投票

我稍微修改了你的代码。使用

strcpy
将一个字符串传递给另一个。请注意,由于
char string[50]
.

,50 是您可以读取的最大字符串大小
#include <stdio.h>
#include <string.h>

int main() {

    char string_array[10][50];
    char string[50];

    for (int x = 0; x < 2; x++)
    {
        printf("Input Name of Fruit number %d\n", x);
        fgets(string, 50, stdin);
        strcpy(string_array[x], string);
    }

    for (int x = 0; x < 2; x++)
    {
        printf("%s\n", string_array[x]);
    }
    return 0;
}

0
投票

为什么不将地址传递给指针数组来存储该唯一值?

问题不对
相同的唯一值地址(

string[]
)在
string_array[x]
中成功存储了3次。

只是第一个

for()
块的每次迭代之后,那个地址是无效的。

© www.soinside.com 2019 - 2024. All rights reserved.