c - 在 C 语言中,在一个小函数中声明并初始化一个变量或者只返回一个响应

标签 c memory-leaks

来自 PHP 背景,我习惯于编写返回字符串(或来自另一个函数的响应)的小函数,如下所示:

function get_something(){
    return "foo";
}

但是,我是 C 的新手,我正在尝试弄清楚如何做一些像这样的真正基础的事情。

人们可以查看以下类似功能并告诉我它们有何不同以及哪个是最好/最干净的使用方式吗?

char *get_foo(){
    char *bar;
    bar = "bar";
    return bar;
}

char *get_foo(){
    char *bar = "bar";
    return bar;
}

char *get_foo(){
    char *bar = NULL;
    bar = "bar";
    return bar;
}

char *get_foo(){
    return "bar";
}

这些功能之间有什么区别还是风格问题?

还有一点。如果我有两个函数,一个调用另一个,这样可以吗?

char *get_foo(){
    return "bar";
}

char *get_taz(){
    return get_foo();
}

更新:如果 get_foo() 未返回 const char*,这些函数需要如何更改?如果 get_foo() 调用另一个具有不同长度的 char* 的函数怎么办?

最佳答案

这四个是等价的,尤其是前三个——编译器很可能将它们编译成完全相同的代码。所以我会选择最后一个,因为它更小。

话虽如此 - 您返回的是 const char*,而不是 char*,因此这段特定代码可能会破坏所有内容,具体取决于您如何使用它(如果它完全编译,无论如何您都可以强制执行)。问题是,您正在返回一个指向字符串的指针,该字符串不是动态分配的,而是可执行镜像的一部分。所以修改它可能很危险。

作为一个更一般的规则,永远不要返回指向堆栈上分配的东西的指针(即不是使用 new 或 malloc 创建的),因为一旦函数结束,该变量的范围也会结束,被销毁,所以你得到指向无效(已释放)内存的指针。

关于c - 在 C 语言中,在一个小函数中声明并初始化一个变量或者只返回一个响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1092334/

相关文章:

Windows 7 上的 Cygwin Control+D 不给出 EOF 信号

c - 如何在STM32F3上实现没有CubeMX的PWM?

c - OpenGL正弦函数向点移动

android - 如何使用应用内更新库防止内存泄漏

php - PHP在单次请求中分配的内存是不是总是在最后释放?

java - 在Java中,在多次调用的非静态方法中将局部变量设置为final会导致内存泄漏吗?

iphone - 为对象分配内存时出现内存泄漏问题

c - 如何暂停和播放声音

c - 如何在 C 中检索数据而不是整行?

c - 内存泄漏 - C