如何在C的只读存储器中写入指针

时间:2018-08-29 07:25:06

标签: c pointers memory segmentation-fault

我正在尝试在另一个指针指向的字符串中间写入一个特定字符,以便我可以截断该字符串。我的程序试图从输入中消除前导/后缀空格。由于指针被存储到只读存储器中,因此我该如何处理它并在两者之间添加一个“ / 0”字符。以下是我的代码,由于上述问题,在第22行出现了分段错误。

#include <stdio.h>
#include<string.h>
#include<ctype.h>

char *trim(char *s)
{
    while(isspace(*s))
        s++;
    char *end = s + strlen(s) - 1;
    while(end>=s && isspace(*end))
    {
        end--;
    }
    *(end + 1) = '\0'; //Line causing segmentation fault
    return s;

}

int main()
{
    char *e = NULL;
    e = trim("hello  ");
    printf("%s", e);
    printf("hi");
    return 0;
}

4 个答案:

答案 0 :(得分:3)

您不能只读内存中,但是您始终可以将字符串存储在堆中(非只读内存)
这就是我要走的路:

  

e = trim(strdup(“ hello”));

它将只读字符串复制到可写内存


编辑:@Ankush指出了已分配字符串的事实,因此必须释放

答案 1 :(得分:3)

由于只读内存是只读的,因此可以使用char数组而不是字符串常量作为trim的参数。

char f[] = "Hello  ";
e = trim(f);

答案 2 :(得分:1)

指针不存储在代码存储器中,这取决于哪个 您用于声明指针的type_qualifiers。

1 . char *ptr = "Stack overflow" ;

现在,将ptr存储到堆栈存储器中并指向 代码存储器,指出它正在存储代码存储器的地址。

2 . char *ptr = malloc(15);
    strcpy(ptr,"stack overflow");

现在您的指针也存储在堆栈存储器中并指向  堆部分(除了扩展的数据存储器外什么都没有。)

3 . char arr[15] , *ptr;
    strcpy(arr,"Stack overflow");
    ptr = arr ;

现在,您的指针存储在堆栈中,并且也指向 数组,该数组也存储在堆栈部分中。

在情况1中,不允许用户修改字符串,因为指针指向代码存储器,但是在情况2和情况3中, 指针可以修改字符串。

答案 3 :(得分:0)

通常,字符串文字存储在只读部分中(取决于平台)。 C标准规定字符串文字具有静态的存储期限,任何对其进行修改的尝试都会给出未定义的行为,因此从不尝试修改字符串文字!

但是您可以执行以下操作:

1-从字符串文字初始化char数组:

char ch_array[256] = "hello ";

2-为字符串动态分配内存:

    char* str = malloc(sizeof(char) * 256);
    strcpy(str, "hello ");

    .
    .
    .
    free(str);

3-或使用strdup()函数(请记住,它实际上不是ISO C标准本身的一部分,它是POSIX)