一个数组影响另一个,两个数组分别声明

时间:2013-04-30 09:34:16

标签: c arrays

我正在编写一些代码,但我遇到了这个问题。我声明了两个数组,一个数组叫做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);
}

2 个答案:

答案 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);