如何给指针赋值

时间:2019-06-22 14:07:57

标签: c pointers segmentation-fault

我有一个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
}

为什么不起作用?

3 个答案:

答案 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"

总体上,不要将指针与其指向的对象混淆