在C中循环的每次迭代中初始化不同的数组

时间:2019-03-14 00:24:04

标签: c arrays

我试图做一个问题,要求用户输入并将该输入存储在数组中多次(因此我使用了循环)。但是,即使我在每次迭代中声明并初始化了一个新的char数组并将其存储在char *数组中,存储在char *数组中的所有char数组(在这种情况下,我试图将它们用作字符串)似乎都相同内存地址,即使我每次都声明一个新地址!这是怎么回事?

非常感谢!

下面是一个简化代码段,用于演示我在说的行为。在运行时,所有输出仅为9。“要求输入”简化为在数组中插入与索引相关的值

int main(int argc, char** argv){

    char* batsman[10];
    for(int i = 0; i < 10; i++){
        char newString[2];
        newString[0] = i + 48;
        newString[1] = '\0';
        batsman[i] = newString;
    }

    for(int i = 0; i < 10; i++){
        printf("%s\n",batsman[i]);
    }
    return 0;
}

3 个答案:

答案 0 :(得分:0)

编译器可以自由选择在哪里为数组分配空间。由于newString在循环中是本地的,因此将其保持在同一位置是最有效的。请记住,并不能保证总是如此。

答案 1 :(得分:0)

没有理由认为那不会发生。

您创建一个对象(一个数组),然后该对象超出范围(循环结束时)。现在,它在内存中的位置可以免费使用。

碰巧(偶然的机会)您的 next 对象(另一个数组)具有相同的地址。下次可能会有所不同。没关系!

当您搬家时,您是否关心之后有人搬入?也许它闲置了几年。也许它是空的,直到被拆除以便为一排商店腾出空间。也许它被一个可爱的家庭立刻拿走了,他们重新粉刷并将其变成一个欢笑的宫殿。 但是您已经不存在了,因此无论哪种方式都不会对您造成丝毫影响。你走了你已经搬家了。

没关系。您的程序已损坏,因为您正在存储指向超出范围的变量的悬空指针。不要那样做请改用std::vector<std::string>

请咨询您的书,以获取有关“原始” C样式数组的复杂性的更多信息。

答案 2 :(得分:0)

问题来了,因为您没有使用内存分配。您将在batsman指针中存储指向循环内定义的字符的指针。编译器在每个循环中使用相同的内存位置(在这种情况下,可以更改),因此当您在循环中修改值时,您将为每个数字执行此操作,因为每个指针都指向相同的内存位置。

要解决此问题,您需要对c标准库中的mallocfree使用动态内存分配。