gpt4 book ai didi

c - 在 C 函数中传递指针参数

转载 作者:太空宇宙 更新时间:2023-11-04 07:20:57 25 4
gpt4 key购买 nike

#include <stdio.h>

// this works
void print_stuff (void* buf) {
printf ("passed arg as buf*: %s\n", buf);
}

/* This works */
void print_stuff_3 (char* buf) {
printf ("passed arg as char*: %s\n", buf);
}

// this does not work
void print_stuff_2 (char** buf) {
printf ("%s\n", *buf);
}

int main () {
char s [] = "hi";

printf ("s = %s\n", s);

// these work
print_stuff (&s);
print_stuff_3 (&s);

// this results in a Segfault
print_stuff_2(&s);
return 0;
}

我对 C 中的事物传递方式有点困惑。我觉得 &s 应该是 char** 类型,但它的行为就像它传递给函数时是 char* 类型。为什么会发生这种行为?

特别是 print_stuff_2 段错误,而我认为 print_stuff_3 会出错。

编辑:为了澄清,我预计 print_stuff(&s)print_stuff_3(&s) 会失败(虽然它们会成功),而 print_stuff_2(&s) 失败,而我认为它应该成功。

最佳答案

您需要记住,字符串不是 C 中的基本类型。它们是字符数组。因此

char s [] = "hi";

使 s 成为 char *(根据变量类型),即指向 3 字符数组 (h) 的第一个字符的指针>、iNUL)。

所以为了传递一个指向字符串的指针,你要使用你的print_stuff_3,作为printf()%s argument 正是这样(指向字符串的指针,即指向第一个字符的指针)。用 print_stuff_3(s) 调用它。

print_stuff 之所以有效,是因为指针就是指针。它将在调用 print_stuff 时被转换为 void * 指针,然后 printf()%s 将将其转换回 char *。用 print_stuff(s) 调用它。

print_stuff_2 不起作用,因为您正在获取存储 s 的地址。如果您编写了 char *s = "hi";,如果您使用 print_stuff_2(&s),它会起作用。您将传递指针的地址,然后使用 *buf 取消引用(以获取指针的值,即指向第一个字符的指针)。除了 buf 之外,这将是一个糟糕的名称选择,因为您将传递一个指向字符指针的指针。

并发症如下。实际上,您正在执行 &s ,当您有

时,它只会返回 s
char s [] = "hi";

(参见 How come an array's address is equal to its value in C? ),但返回指针变量 s 在堆栈中存储的地址,如果您有:

char *s = "hi";

获取数组的地址并没有实际意义(因此求值为第一个元素的地址)。如果要获取指针的地址,则需要使用 char *s = "hi";

关于c - 在 C 函数中传递指针参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21685838/

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