【问题标题】:C - Passing pointer to function [duplicate]C - 将指针传递给函数[重复]
【发布时间】:2017-11-27 10:15:37
【问题描述】:

谁能告诉我为什么这段代码不起作用?我尝试使用 gcc 6.3 编译和运行它,但 printf 的结果是一种内存混乱:“P@”而不是“某物”。在https://www.jdoodle.com/c-online-compiler 上用 gcc 5.3 编译它,给了我确切的结果(“某事”)。

#include <stdio.h>

char *vari;

void foo(char **ts)
{
    char buffer[] = "something";
    *ts = &buffer[0];
}

int main (void)
{
    foo(&vari);
    printf("vari: %s\n", vari);
}

【问题讨论】:

  • 未定义行为,一旦您离开foo(),buffer 将不再存在。
  • 重复链接 1:为什么这不起作用。重复链接 2:为什么即使它“似乎有效”也不能依赖它。重复链接 3:如果您将其声明为指针,为什么它会起作用。

标签: c pointers gcc


【解决方案1】:

buffer[] 具有自动存储期限。

在该函数的调用者中使用设置为其地址的指针将导致未定义的行为。

如果你写的话,情况就不同了

static const char* buffer = "something";

改为。

【讨论】:

    【解决方案2】:

    buffer 的生命周期将在函数 foo 返回后结束,因为它具有自动存储期限。这将使您的程序的行为未定义。
    您可以动态分配具有静态存储持续时间的内存

    void foo(char **ts)
    {
        char *buffer= malloc(10);
        strcpy(buffer, "something")
        *ts = &buffer[0];
    }
    

    【讨论】:

    • ...注意,调用者负责free该内存。
    • @Bathsheba;是的,当然是在调用者函数中。
    【解决方案3】:

    这是未定义的行为。在其范围之外访问自动存储生命周期元素可能会导致任何事情。

    当foo() 函数结束时,buffer 的内存被释放。

    你可以通过不同的方式解决问题

    • 将buffer设为静态存储时长。

    • 分配内存,然后将文字 "somehting" 复制到它并分配给 *ts。

    【讨论】:

      猜你喜欢
      • 2019-07-26
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      相关资源
      最近更新 更多