将 char 指针传递给辅助函数并在 C 中赋值的正确方法

Correct way to pass the char pointer to helper fuction and assign the value in C

我有一些关于在辅助函数中将值赋给 char* 的问题。如果我有以下代码

int main() {
    char *p = malloc(6* sizeof(char));
    changeValue(p);
    printf("value of p=%s\n", p);

    return 0;
}

如果我定义以下函数,则它不起作用:

void changeValue(char* input){
    input = "hello";
}

我的第一个问题是我们不能直接给指针赋值的原因是什么? 我之前的理解是因为 space "hello" 只在 changeValue 范围内创建,一旦离开 changeValue 函数,它就会被销毁。但是,如果我使用指针的指针来分配它起作用的值。似乎“你好”space 没有被破坏:

void changeValue(char ** input){
    *input = "hello";
}

主要我需要改成:

char **p2 = malloc(sizeof(char*));
changeValue(p2);
printf("value of p2=%s\n", *p2);

而且它工作正常。我的第二个问题是第二个函数发生了什么使其正常工作,我之前的逻辑哪一部分是错误的?

我也找到了下面的赋值方式:

changeValue函数保持不变:

void changeValue(char ** input){
    *input = "hello";
}

在主 cpp 中我做了以下操作:

char *p = malloc(6* sizeof(char));
changeValue(&p);
printf("value of p=%s\n", p);

似乎它也能正常工作,但对我来说没有任何意义。我的第三个问题是输入是 p 在内存中的地址,如何解引用地址并为其赋值?

在辅助函数中分配 char* 值的正确方法是什么?

谢谢

在第一个版本中,'p' 指向分配的内存(6 字节)。在第二个版本中,p2 指向将包含一个地址的内存。

在您的辅助函数的第一个版本中:

void changeValue(char* input){
    input = "hello";
}

在该函数之外,'p' 仍指向分配的内存。当程序进入 changeValue() 函数时,'p' 的值被压入堆栈,现在它被一个名为 'input'... 的新字段引用,该字段仅存在于堆栈中。因此,通过将文字“hello”分配给它,您已将 'p' 替换为字符串文字“hello”的地址。

同时,'p' 的位置与 'input' 不同。一旦函数returns,临时分配给'input'的内存已经被弹出,不再相关

也许图表可以提供帮助:

最初:

char *p = malloc(6* sizeof(char));


 (Stack)                 (Heap)

+-------+          +------------------+
|   p   +--------> | 6 * sizeof(char) |
+-------+          +------------------+

接下来,调用:

changeValue(p); // first version

影响以下:

 (Stack)                 (Heap)
+-------+
| input +----+
+-------+    |     +------------------+
|   p   +----+---> | 6 * sizeof(char) |
+-------+          +------------------+

然后:

input = "hello";

 (Stack)              (Heap)               (DataSegment)

+-------+                                    +-------+
| input +----------------------------------->|"hello"|
+-------+       +------------------+         +-------+
|   p   +-----> | 6 * sizeof(char) |
+-------+       +------------------+

并且在从 'changeValue' 退出时,堆栈被展开并且 'input' 不再相关。

 (Stack)                 (Heap)

+-------+          +------------------+
|   p   +--------> | 6 * sizeof(char) |
+-------+          +------------------+

并且在 main 函数的末尾,您现在有内存泄漏(malloc 的内存尚未被释放)。

辅助函数的一种正确使用方法是:

int main() {
    char *p = malloc(6* sizeof(char));

    changeValue(p, 6* sizeof(char) );   

    printf("value of p=%s\n", p);

    free( p ) ;        // <<<<<< avoid memory leak

    return 0;
}

void changeValue(char * input, size_t maxSize){
    // ... Copy "hello" into the space pointed to by input, taking
    //     care not to overrun the memory
    strncpy( input, "hello", maxSize ) ;
}

关于这个问题,我认为存储指针s的内存,其大小取决于系统,和指针s指向的内存,即分配的6字节大,是两个不同的概念。

“第三位代码(char p = malloc(6 sizeof(char)); changeValue(&p);)是错误的,因为p指向的内存可能不够大,无法容纳指针。在具有 64 位指针的系统上,sizeof(char *) 通常为 8,大于您分配的 6 * sizeof(char)。顺便说一句,根据定义,sizeof(char) 为 1,因此 malloc(6 * sizeof(char)) 与 malloc(6) 相同。 ”