[英]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.