繁体   English   中英

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

[英]How to write to a pointer in read only memory in C

我试图在另一个指针指向的字符串中间写入一个特定字符,以便截断该字符串。 我的程序试图从输入中消除前导/后缀空格。 由于指针被存储到只读存储器中,因此我该如何处理它并在两者之间添加一个“ / 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;
}

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

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

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


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

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

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

指针不存储在代码存储器中,它取决于您用来声明指针的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中,指针可以修改字符串。

通常,字符串文字存储在只读部分中(取决于平台)。 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM