2013-04-30 36 views
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); 
} 

回答

1

user字符数组被定义与大小= 1这一定义

char user[] = {0}; 

上述定义意味着焦炭阵列包含一个elment其为0。user阵列的声明以这种方式意味着user数组的大小从您在声明中放入的元素数量中推导出来。

在for循环中,您正在为char数组元素赋值,其索引不存在于user数组中。所以,你会得到不确定的行为

更改您的数组的声明:

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

编辑

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

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

而当涉及到user数组指针内存成为你的程序没有用,不要忘了

free(user); 
+0

我没有把变量长度放到数组声明中的原因是因为我的编译器(xcode)得到一个错误,指出“变量大小的对象可能未被初始化”。 把10的索引后,代码工作正常!所以缺少的索引是这个问题谢谢。 有没有办法允许数组大小根据长度而变化? – user2335238 2013-04-30 09:46:09

+0

@ user2335238答案已更新请参阅编辑部分以了解您的问题的答案 – MOHAMED 2013-04-30 09:55:35

3

你不分配user阵列中的任何房间自由,它由于您只提供一个初始化值,所以长度为1。所以当你写入它时,你会这样做超出限制并溢出到其他变量所使用的内存中。

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

const char start[] = "Hello"; 

const char *start = "Hello"; 

最后,即使有空间的循环不正常终止user如此,后续printf()%s,期望以0结尾的字符串将调用未定义的行为。