#include <stdio.h>
#include "../library/string.c"
int test(char* left, char* right) {
while ( *left != '\0') {
printf("%p\t%d, %d\n", left, (*left) + 1, *left);
left++;
}
return 0;
}
int main() {
char* a = "hello,kittz";
char* b = "hello,kitty";
test(a, b);
return 0;
}
当我执行上面的代码时,输出如下:
0x40073f 105, 104
0x400740 102, 101
0x400741 109, 108
0x400742 109, 108
0x400743 112, 111
0x400744 45, 44
0x400745 108, 107
0x400746 106, 105
0x400747 117, 116
0x400748 117, 116
0x400749 123, 122
但是当我将代码更改为:
int test(char* left, char* right) {
while ( *left != '\0') {
printf("%p\t%d, %d\n", left, (*left)++, *left);
left++;
}
return 0;
}
输出告诉我发生了错误。这是输出: 分段错误(核心转储)。
答案 0 :(得分:4)
In [47]:
df = pd.DataFrame(np.random.randn(5,2), columns=['','asd'])
df
Out[47]:
asd
0 -0.911575 -0.142538
1 0.746839 -1.504157
2 0.611362 0.400219
3 -0.959443 1.494226
4 -0.346508 -1.471558
In [48]:
df.drop('',axis=1)
Out[48]:
asd
0 -0.142538
1 -1.504157
2 0.400219
3 1.494226
4 -1.471558
正在尝试更改(*left)++
指向的值 - 即它正在尝试将编译时文字'k'更改为'l'。这是不允许的(严格来说,它的'未定义行为' - 这意味着它有时可能在某些系统上运行,或者它可能会格式化您的硬盘驱动器,或点亮白宫草坪上的圣诞树......)
答案 1 :(得分:0)
要查找段错误,您可以使用许多工具。
首先使用标志gcc -Wall -Wextra -Werror
进行编译有时会有所帮助。
另外,您可以使用@Jules说添加-g
标志来帮助使用gdb。您的gdb环境中的set env MallocStackLogging 1
真的非常有帮助!并且可以向您显示出现段错误的行
对于在字符串中导航,您可以使用Int:
int i = 0;
char str[] = "hello world";
while (str[i])
putchar(str[i++]);
但你也可以使用像
这样的指针while (*str)
*str++;