【问题标题】: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"

      总的来说,不要将指针与其指向的对象混淆

      【讨论】:

        猜你喜欢
        • 2019-02-09
        • 2021-01-13
        • 2011-01-20
        • 1970-01-01
        • 2014-09-06
        • 2016-10-05
        • 1970-01-01
        • 2019-09-18
        • 1970-01-01
        相关资源
        最近更新 更多