尝试修改指向数组的指针时出现段错误

时间:2014-03-25 21:17:33

标签: c arrays pointers segmentation-fault

当我尝试修改指向数组的指针时,为什么会出现段错误? 我的例子是:

void delete_string(char** string) {
    while (*string[0] != '\0') {
    *string = *string + 1;
    }
}
int main() {
    char aux1[] = "a string";
    delete_string(&aux1);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

User3461734的答案事实上是正确的,但并没有真正解释原因。第一个线索是编译器警告你会收到:

t.c:8: warning: passing argument 1 of ‘delete_string’ from incompatible pointer type
t.c:1: note: expected ‘char **’ but argument is of type ‘char (*)[9]’

您的函数期望指向指向字符的指针。你实际上是在给它一个指向9个字符数组开头的指针。

这个表达式:

*string[0] != '\0'

告诉它取消引用提供的指针。你已经给它一个指向包含字符“a string”的字符串的指针 - 它将这些字符解释为指针,而不是一组字符。指针指向地址0x676e697274732061(或至少在我的64位基于intel的系统上)。如果你仔细观察,你会发现这个地址是你的字符串的ascii字符,反过来(61 ='a',20 ='',73 ='s'等)。

如果您要将aux1的声明更改为:

char *aux1 = "a string";

它可以工作,因为现在你声明一个指针变量(类型为char *),它被初始化为指向包含字符“a string”的只读存储器区域。当您将& aux1传递给函数时,您将向它传递一个指向变量的指针,这是您的函数所期望的。

然而,它可能不会做你想要的,阅读其余的代码。在函数结束时,aux1指针将指向字符串的空终止。我不是很清楚如何删除字符串或者之后用指针做什么。

答案 1 :(得分:0)

要修复段错误,您必须更改第7行,替换:

char aux1[] = ""

使用:

char *aux1 = "a string"