我有一个char指针,并给了它一个值。在下一步中,我想更改第一个字母。
#include <stdio.h>
#include <stdlib.h>
void main() {
char * str;
str = (char*)malloc(4);
str = "abc";
printf("%s\n", str); //output: abc
*str = 'c'; //segmentation fault
printf("%s\n", str); //here i would like to have output cbc
}
为什么不起作用?
答案 0 :(得分:4)
在为str分配“ abc”时,它不会将“ abc”复制到新分配的内存中。相反,str现在指向存储常量“ abc”的只读内存。
您遇到分段错误,因为您尝试写入只读内存。
代替
str = "abc";
尝试
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
str[3] = '\0';
答案 1 :(得分:2)
代码中几乎没有问题。首先,在这里
str = (char*)malloc(4); /* dynamic memory i.e str points to heap section */
str = "abc"; /* str now points to ready only memory i.e string constants */
您正在用字符串文字"abc"
覆盖动态分配的内存,即str
不再指向动态内存,这会导致内存泄漏。
为避免所有这些问题,请创建一个本地字符数组,而不是动态数组,然后更改str[0]
。对于例如
char str[4] = "abc";
*str = 'c';
或者如果您想先进行memcpy()
,然后再复制mallco()
,则使用abc
。对于例如
int main(void) {
char *str = malloc(4); /* Don't use magic number like 4, use MACRO instead */
if(str == NULL) {
/* @TODO Error Handling of malloc failure */
}
memcpy(str, "abc",sizeof("abc"));
printf("%s\n", str);
*str = 'c';
printf("%s\n", str);
/* free dynamic memory */
return 0;
}
答案 2 :(得分:1)
如何为指针分配值?
当然可以使用赋值运算符之一。通常,在某些情况下,也可以使用简单的赋值运算符(=
,但也可以使用加号(+=
)和减号(-=
)。
我有一个char指针,并给了它一个值。
实际上,您给它两个不同的值,一个接一个。首先,
str = (char*)malloc(4);
您给它提供一个值,该值指向您的四字节动态分配的空间。请注意,在C语言中,强制类型转换是不必要的,许多人认为它的样式很差。
然后,用
str = "abc";
,您为其分配了一个不同的值,从而丢失了前一个值,从而导致内存泄漏。您正在为指针分配一个值 ,而不修改它指向的数据。
您可以通过多种方法来修改指向的内存。
您可以直接通过指针和相关指针进行分配(不要忘记字符串终止符!):
*str = 'a';
*(str + 1) = 'b';
// etc.
与上一个等效,您可以使用索引语法
str[0] = 'a';
str[1] = 'b';
// etc.
您可以使用memcpy()
或memmove()
函数执行块复制:
memcpy(str, "abc", 4);
特别是对于C字符串(例如您的C字符串),有一些专用于此目的的函数,常见的是strcpy()
:
strcpy(str, "abc");
请注意,strcpy
希望源以null终止,所有字符串文字都是这样,而其他一些字符数组则不是。
下一步,我想更改第一个字母。
您的语法对此是正确的,但是您不能修改字符串文字。那就是您原始代码要尝试执行的操作,因为这是您的第二次分配,导致str
指向文字"abc"
。
总体上,不要将指针与其指向的对象混淆。