为什么我的代码在指定的行中生成SIGSEGV?我想将我的字符串的第一个字符更改为'k'(小写)
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
struct node
{
int data;
struct node* next;
};
void fun1(char** head)
{
printf("FUN2---%s",*head);
//this line produces a segmentation fault
**head='k';
}
void fun(char** head)
{
printf("FUN---HEAD:%s\n",*head);
fun1(head);
}
int main()
{
char *ptr="KEWIN";
printf("PTR:%p\n",ptr);
fun(&ptr);
printf("%s",ptr);
return 0;
}
答案 0 :(得分:1)
您正在尝试更改字符串文字,这取决于编译器实现,可能会也可能不会放在已编译程序的只读数据段中。如果它被放置在只读数据段中,那么任何在那里写入的尝试都将导致段错误。使您的名称成为char name []而不是char * name将字符串放在堆栈上,您将能够在那里写入它。此外,将char **传递给您的函数会增加不必要的间接级别。看到这段代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
int data;
struct node* next;
};
void fun1(char * head)
{
printf("FUN2---%s\n", head);
// no seg fault anymore
*head='k';
}
void fun(char * head)
{
printf("FUN---HEAD:%s\n",head);
fun1(head);
}
int main()
{
char name[] = "KEWIN";
printf("PTR:%p\n",name);
fun(name);
printf("%s",name);
return 0;
}