指向字符的指针 - 在函数中取消引用

时间:2017-06-18 08:42:25

标签: c string function pointers

为什么我的代码在指定的行中生成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;
    }

1 个答案:

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