gpt4 book ai didi

c - 函数指针中的段错误

转载 作者:行者123 更新时间:2023-11-30 18:44:38 25 4
gpt4 key购买 nike

我有一个示例代码如下,因为我不熟悉函数指针,所以我无法找出发生了什么ret = (p_local->str)(10,b_in); (段错误)

#include "stdio.h"

typedef int (*check)(const int a, char * const b[]);

typedef struct ST_T_COMMAND
{
char *chuoi;
check str;
} T_COMMAND;

const T_COMMAND *p_global;

int main()
{
int ret;
const T_COMMAND *p_local;
char *b_in[] = {"1234", "abchd"};
T_COMMAND str_new;

p_global = &str_new;
str_new.chuoi = "1234";
p_local = p_global;

if(strcmp(p_local->chuoi, b_in[0]) == 0)
{
ret = (p_local->str)(10, b_in);
printf("ret = %d\n", ret);
}
else
{
printf("else\n");
}
return 0;
}

我想传递那个段错误。请告诉我我的代码有什么问题

最佳答案

这里

typedef int (*check)(const int a, char * const b[]);

你已经声明了函数指针,即check是函数指针名称,它可以指向任何输入参数为int的函数,并且char* const [] 类型 & 返回 int 类型。

这里

ret = (p_local->str)(10, b_in); /* calling via function pointer */

您正在尝试通过函数指针调用,但您尚未在任何地方初始化函数指针。您需要在调用函数指针之前先初始化它。

还有

const T_COMMAND *p_local; /* initialize it here itself */

上面的语法意味着 p_local 指向的位置是恒定的,即当你这样做时

p_local->str = funHandler;

正如我下面所做的那样,编译器将不允许它修改。

p_global相同,如果你之前将其设为const,则不能这样做

const T_COMMAND *p_global;
p_local = p_global; /* not possible due to above const declaration of p_global */

尝试这个版本:

#include <stdio.h>
#include <string.h>
typedef int (*check)(const int a, char * const b[]);
typedef struct ST_T_COMMAND
{
char *chuoi;
check str;
}T_COMMAND;

T_COMMAND *p_global; /* removed const */
int funHandler(int num, char* const buf[10])
{
printf("in funHandler() %d %s\n", num, buf[0]);
return num;
}
int main(void)
{
int ret;
T_COMMAND *p_local; /* removed const */
char * b_in[] = {"1234","abchd"};
T_COMMAND str_new;
p_global = &str_new;
str_new.chuoi = "1234";
p_local = p_global;

if(strcmp(p_local->chuoi,b_in[0]) == 0)
{
p_local->str = funHandler; /* initialize function pointer, you missed this */
ret = (p_local->str)(10,b_in);
printf("ret = %d\n",ret);
}
else
{
printf("else\n");
}
return 0;
}

关于c - 函数指针中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57470922/

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