Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-将指针传递给函数_C_Pointers_Gcc - Fatal编程技术网

C-将指针传递给函数

C-将指针传递给函数,c,pointers,gcc,C,Pointers,Gcc,有人能告诉我为什么这个代码不起作用吗?我试图用GCC6.3编译并运行它,但printf的结果是一种内存混乱:P@而不是其他东西。在GCC5.3上编译它,可以得到确切的结果 #include <stdio.h> char *vari; void foo(char **ts) { char buffer[] = "something"; *ts = &buffer[0]; } int main (void) { foo(&vari);

有人能告诉我为什么这个代码不起作用吗?我试图用GCC6.3编译并运行它,但printf的结果是一种内存混乱:P@而不是其他东西。在GCC5.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函数结束时,缓冲区的内存被释放

你可以用不同的方法来解决这个问题

使缓冲区的静态存储持续时间

分配内存,然后将文本something复制到内存中,并将其分配给*ts


这是未定义的行为。在自动存储生命周期元素的作用域之外访问该元素可能会导致任何结果

当foo函数结束时,缓冲区的内存被释放

你可以用不同的方法来解决这个问题

使缓冲区的静态存储持续时间

分配内存,然后将文本something复制到内存中,并将其分配给*ts

一旦函数foo返回,缓冲区的生存期将结束,因为它具有自动存储持续时间。这将使程序的行为未定义。 您可以动态分配具有静态存储持续时间的内存

void foo(char **ts)
{
    char *buffer= malloc(10);
    strcpy(buffer, "something")
    *ts = &buffer[0];
}
一旦函数foo返回,缓冲区的生存期将结束,因为它具有自动存储持续时间。这将使程序的行为未定义。 您可以动态分配具有静态存储持续时间的内存

void foo(char **ts)
{
    char *buffer= malloc(10);
    strcpy(buffer, "something")
    *ts = &buffer[0];
}
缓冲区[]具有自动存储持续时间

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

如果你写信的话,事情就不一样了

static const char* buffer = "something";
相反。

缓冲区[]具有自动存储持续时间

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

如果你写信的话,事情就不一样了

static const char* buffer = "something";

相反。

未定义的行为,一旦您离开foo,缓冲区就不再存在。重复链接1:为什么这不起作用。重复链接2:为什么你不能依赖它,即使它看起来有效。重复链接3:如果您将其声明为指针,它为什么会工作。未定义的行为,一旦您离开foo,缓冲区就不再存在。重复链接1:为什么不工作。重复链接2:为什么你不能依赖它,即使它看起来有效。重复链接3:如果您将其声明为指针,它为什么会工作……注意到调用方有责任释放内存。@Bathsheba;是的,当然是在调用者函数中……注意,调用者有责任释放内存。@Bathsheba;是的,当然是在调用函数中。