我写了以下代码:
#include <stdio.h>
#include <string.h>
int main()
{
char *string = "abcd";
int i;int j;
int array[5];
for(i=0; i<strlen(string); i++)
array[i] = string[i];
for(j=0; j<4; j++)
printf("array[i] %dn",array[i]);
array[0] = string[0];
printf("array[0] %dn",array[0]);
return 0;
}
我得到以下输出:
array[i] 4195888
array[i] 4195888
array[i] 4195888
array[i] 4195888
array[0] 97
我认为输出将是:
array[i] 97
array[i] 98
array[i] 99
array[i] 100
array[0] 97
如果此作业:
array[0] = string[0];
将97分配给数组[0],然后为什么在循环中进行类似的作业,产生不同的输出,我该如何修复代码,以使输出看起来像我所期望的?
问题是不匹配的索引值。
for(j=0; j<4; j++)
printf("array[i] %dn",array[i]);
应该是
for(j=0; j<4; j++) // j is the loop control variable
printf("array[j] %dn",array[j]); // so, use j as index here
否则,发生的事情是,您将i
的最后值用作索引,这是一种尝试访问包含不确定值的非初始化元素(即array[4]
)的尝试。这调用了未定义的行为。
要安全起见,您最好将局部变量初始化到您的功能。
正如已经指出的那样,您的printf循环在j上,但是您将i用作数组中的索引,而您应使用j索引。您还在printf中进行了j个硬编码,应该为%d,然后用j。
填充。#include <stdio.h>
#include <string.h>
int main()
{
char *string = "abcd";
int i;int j;
int array[5];
for(i=0; i<strlen(string); i++)
array[i] = string[i];
for(j=0; j<4; j++)
printf("array[%d] %dn",j,array[j]);
array[0] = string[0];
printf("array[0] %dn",array[0]);
return 0;
}
然后您的输出将如预期的:
array[0] 97
array[1] 98
array[2] 99
array[3] 100
array[0] 97