下面的程序在第一个循环中正确地打印了数组hello
。但是在第二个循环中,它只打印了o
。当然整数k
是没有意义的,但是我使用它是因为我认为原因可能是我在第一个for循环中使用了i
我期待得到hello
x2,但我采取了hello
和o
。我仍然不明白为什么会发生这种情况,老实说,我试图弄清楚这一点超过一个小时,我卡住了
#include <stdio.h>
#include <string.h>
int main() {
int i = 0;
int j = 0;
int plus = 0;
char s[20] = "hello";
strlen(s);
int a = strlen(s);
int count[strlen(s) - 1];
int k = 0;
for (i = 0; i < a; i++) {
printf("%c", s[i]);
if (s[i] == ' ')
continue;
else {
for (j = 0; j < a; j++) {
if (s[i] == s[j]) {
plus++;
count[i] = plus;
}
}
}
plus = 0;
}
printf("\n");
// find max/es counts
for (k = 0; k < a; k++) {
printf("%c", s[k]);
}
return 0;
}
字符串
这个程序的目的并不重要,我只是想帮助理解为什么printf
会给出这样的输出。
2条答案
按热度按时间esyap4oy1#
这个程序在你分配
count[i]=plus;
和i==a
时调用未定义的行为。您需要从定义中删除
-1
。#一些补充说明:
1.使用正确的尺寸类型-即
size_t
而不是int
1.使用有意义的变量名,而不是
a
,i
,j
,k
.1.您的
strlen(s);
行没有使用返回值是没有意义的字符串
khbbv19g2#
我用GDB调试了你代码,发现了一些有趣的信息。
字符串
s
的存储器地址是0xffffd340
,而count
的存储器地址是0xffffd330
。0xffffd340 - 0xffffd330 = 0x10
的值。“count
有多少个元素?strlen(s) - 1
,根据你的代码,int count[strlen(s) - 1];
.s
的值是“你好”,因此count
具有5-1=4
元素。count的每个元素的大小为4字节,
count
占用4字节,4字节的内存地址为0xffffd330,0xffffd334,0xffffd338,0xffffd33c,0xffffd340
。计数的最后一个元素的地址是
0xffffd340
。如果运行count[4] = 5
,则0xffffd340-0xffffd341-0xffffd342-0xffffd343
中的数据将是5-0-0-0
。0xffffd340
也是s.data的存储器地址,在0xffffd340-0xffffd341-0xffffd342-0xffffd343-0xffffd344
中的数据是h-e-l-l-o
。count[4] = 5
覆盖0xffffd340-0xffffd341-0xffffd342-0xffffd343
中的数据,并且s的值变为5-0-0-0-o
。这是我行提供的日志。
型
将
int count[strlen(s) - 1];
修改为int count[strlen(s)];
或注解count[i] = plus;
将修复您的错误。