gpt4 book ai didi

c - 从另一个函数中的指针检索值时出现段错误

转载 作者:行者123 更新时间:2023-12-04 10:30:14 25 4
gpt4 key购买 nike

我是 C 的初学者,遇到了以下问题:

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

void myFunc(char **data);

int main() {
char **header;
myFunc(header);
printf("[In main] %s\n", header[1]); // This gives segmentation fault
return 0;
}

void myFunc(char **data) {
data = (char **)malloc(2 * sizeof(char *));
data[0] = "test";
data[1] = "test 2";
printf("[In myFunc] %s\n", data[1]); // This works just fine
}

我可以在为它分配内存的函数中检索并打印指针的值,但在此之外(在 main 中),它会出现段错误。

最佳答案

您遇到的问题对于指针的使用以及将指针作为参数参数传递给函数时会发生什么更为根本。当您将指针传递给函数时(就像任何变量一样),函数会收到该指针(或变量)的副本。这意味着当 header 传递给 myFunc 时,myFunc 会收到一份 header 作为 data(有自己的,非常不同的地址):

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

void myFunc(char **data);

int main() {
char **header;
printf ("\n the address of header in main: %p\n", &header);
myFunc(header);
printf("[In main] %s\n", header[1]); // This gives segmentation fault
return 0;
}

void myFunc(char **data) {
data = malloc(2 * sizeof(char *));
printf ("\n the address of data in myFunc: %p\n", &data);
data[0] = "test";
data[1] = "test 2";
printf("[In myFunc] %s\n", data[1]); // This works just fine
}

输出

$ ./bin/myFunc1

the address of header in main: 0x7ffd112e27b8

the address of data in myFunc: 0x7ffd112e2798
[In myFunc] test 2
Segmentation fault

注意mainheader的地址是0x7ffd112e27b8,但是当你为myFunc 中的 data,您将新内存块的起始地址分配给位于 0x7ffd112e2798 的指针。 main 中的任何内容都不知道内存地址 0x7ffd112e2798

我们如何修复它?

就像您每次希望将变量传递给函数、更新该变量并将更改后的值反射(reflect)回调用函数(此处为main)时所做的那样——您传递函数变量的地址:

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

void myFunc(char ***data);

int main() {
char **header;
printf ("\n the address of header in main: %p\n", &header);
myFunc(&header); /* passing address of header to myFunc */
printf("[In main] %s\n", header[1]);
return 0;
}

void myFunc(char ***data) {
*data = malloc(2 * sizeof(char *));
printf ("\n the address of data in myFunc: %p\n", data);
(*data)[0] = "test";
(*data)[1] = "test 2";
printf("[In myFunc] %s\n", (*data)[1]);
}

现在您已经将 header 的地址作为 data 传递给 myFunc,当您为*data,您正在为 main 中的 header 分配内存并返回指向相同地址的指针。这允许:

输出

$ ./bin/myFunc2

the address of header in main: 0x7ffdd72b1968

the address of data in myFunc: 0x7ffdd72b1968
[In myFunc] test 2
[In main] test 2

利用 myFunc 的返回值

您还可以返回新内存块的起始地址到 main 并完成同样的事情,例如:

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

char **myFunc(char **data);

int main() {
char **header;
printf ("\n the address of header in main: %p\n", &header);
header = myFunc(header);
printf("[In main] %s\n", header[1]); // This works fine too
return 0;
}

char **myFunc(char **data) {
data = malloc(2 * sizeof(char *));
printf ("\n the address of data in myFunc: %p\n", &data);
data[0] = "test";
data[1] = "test 2";
printf("[In myFunc] %s\n", data[1]); // This works just fine
return data;
}

输出

$ ./bin/myFunc3

the address of header in main: 0x7ffee22e3298

the address of data in myFunc: 0x7ffee22e3278
[In myFunc] test 2
[In main] test 2

现在 main 通过将返回分配给 header 知道分配给 myFunc 中的 data 的地址.

关于c - 从另一个函数中的指针检索值时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33714323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com