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