0

我正在编写一些代码,我遇到了这个问题。我声明了两个数组,一个数组叫做 start,它初始化为字符串 hello。第二个数组称为 user ,应该使用 for 循环声明为_ 。但发生的情况是我的名为 start 的数组被修改了,所以我的输出如下所示:

Printed word: Hello

Array Length: 5

_____o

为什么我的起始数组被重写?对不起,如果这是我自己学习的菜鸟问题。

#include <stdio.h>
#include <string.h>

int main(void)
{   
    size_t length = 0;
    char start [] = {"Hello"};
    printf("\nPrinted word: %s\n", start);
    length = strlen(start);
    printf("Array Length: %zi\n", length);

    char user[] = {0};

    for(size_t x = 0; x < length; x++){   //starting here
        user[x] = '_'; 
    }

    printf("%s\n",start);
}
4

2 回答 2

3

您没有在user数组中分配任何空间,它的长度为 1,因为您只提供了一个初始值设定项。因此,当您写入它时,您会越界并溢出到其他变量使用的内存中。

此外,对于带引号的字符串,不需要大括号,它应该是:

const char start[] = "Hello";

或者

const char *start = "Hello";

最后,即使有空间,您的循环也没有正确终止user,因此预期以 0 结尾的字符串的后续printf()with%s将调用未定义的行为。

于 2013-04-30T09:40:22.563 回答
1

userchar 数组定义为 size = 1 与此定义

char user[] = {0};

上面的定义意味着char数组包含一个元素为0。这样声明user数组意味着user数组的大小是从你在声明中放入的元素数推导出来的。

在 for 循环中,您将值分配给 char 数组元素,其中数组不存在索引user。所以你会得到未定义的行为

将数组的声明更改为:

char user[length+1] = {0};

编辑

如果您的编译器不支持声明具有可变长度的静态数组,您可以在这种情况下使用动态内存分配。

char *user = malloc((length+1) * sizeof(char));

当你的程序中与数组指针相关的内存user变得无用时,不要忘记释放它

free(user);
于 2013-04-30T09:36:46.617 回答