【问题标题】:How to assign value to a pointer [duplicate]如何为指针赋值[重复]
【发布时间】:2019-11-05 01:17:56
【问题描述】:
我有一个 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
}
为什么它不起作用?
【问题讨论】:
标签:
c
pointers
segmentation-fault
【解决方案1】:
当您将“abc”分配给 str 时,它不会将“abc”复制到新分配的内存中。相反,str 现在指向存储常量“abc”的只读内存。
您遇到分段错误,因为您尝试写入只读内存。
而不是
str = "abc";
试试
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
str[3] = '\0';
【解决方案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';
如果您想先使用mallco(),然后使用abc,请使用memcpy()。例如
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;
}
【解决方案3】:
如何给指针赋值?
当然,使用其中一个赋值运算符。通常是简单的赋值运算符 (=),但在某些情况下也可以使用加号 (+=) 和减号 (-=)。
我有一个 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 字符串,比如你的,有专门用于此目的的函数,常见的是 strcpy():
strcpy(str, "abc");
请注意,strcpy 期望源以 null 结尾,所有字符串文字都是这样,但其他一些字符数组不是。
下一步我想更改第一个字母。
您的语法对此是正确的,但您不能修改字符串文字。这就是您的原始代码正在尝试做的事情,因为这是您的第二次分配导致 str 指向文字 "abc"。
总的来说,不要将指针与其指向的对象混淆。