【问题标题】:warning: ‘s’ is used uninitialized in this function [-Wuninitialized]警告:在此函数中使用了未初始化的“s”[-Wuninitialized]
【发布时间】:2021-04-15 17:01:16
【问题描述】:

基本上在最基本的层面上我无法理解为什么我不能这样做:

#include <stdio.h>
#include <stdlib.h>

void mal(char *str){
    str = malloc(sizeof(char));
}



int main(void)
{
    char *s;
    mal(s);
    free(s);
    return 0;
}  

【问题讨论】:

  • 因为str 内部mal()s 内部main() 是不同的对象。对str 的任何更改不会反映在s 中(换句话说:C 按值传递参数)。
  • 请注意,分配单个字符意味着结果只能(合法地)存储一个字符串——空字符串。
  • 最基础的层次是你不了解C函数实参和参数的工作原理。

标签: c memory memory-management memory-leaks malloc


【解决方案1】:

s 按值传递给函数mal。在mal 内部,本地参数str 被赋值更改,但main 中的s 保持未初始化。在 C 中,您应该将指向 s 的指针传递给 mal 以解决此问题:

#include <stdio.h>
#include <stdlib.h>

void mal(char **str){ // pointer to pointer
    *str = malloc(sizeof(char)); // referenced variable behind str changed
}



int main(void)
{
    char *s;
    mal(&s); // pointer to s passed
    free(s);
    return 0;
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    相关资源
    最近更新 更多