为什么会导致分段错误

时间:2016-05-26 15:47:38

标签: c

#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;
}

输出告诉我发生了错误。这是输出: 分段错误(核心转储)。

2 个答案:

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