当我尝试修改指向数组的指针时,为什么会出现段错误? 我的例子是:
void delete_string(char** string) {
while (*string[0] != '\0') {
*string = *string + 1;
}
}
int main() {
char aux1[] = "a string";
delete_string(&aux1);
return 0;
}
答案 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"