我正在编写一些代码,但我遇到了这个问题。我声明了两个数组,一个数组叫做start,它被初始化为字符串hello。第二个数组称为user,应该使用for循环声明为 _ 。但是,我的数组名为start被修改,所以我的输出看起来像这样:
Printed word: Hello
Array Length: 5
_____o
为什么我的start数组被重写?对不起,如果这是一个菜鸟问题我自己学习。
#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);
}
答案 0 :(得分:3)
您没有在user
数组中分配任何空间,它的长度为1,因为您只提供单个初始化值。因此,当你写入它时,你正在超出界限并溢出到其他变量使用的内存中。
另外,对于引用的字符串,不需要大括号,它应该是:
const char start[] = "Hello";
或
const char *start = "Hello";
最后,即使有空间你的循环没有正确终止user
,所以随后的printf()
%s
期望0终止的字符串将调用未定义的行为。
答案 1 :(得分:1)
user
char数组定义为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);