日期:2014-05-16  浏览次数:20782 次

gnu c 的小问题
3个文件
********************************************************************************

main.c


#include <stdio.h>
#include <fun.h>
int main(void)
{
t_fops ts;
ts.add(1,2);
return 0;
}

*************************************************************************************

fun.c


#include <fun.h>
#include <stdio.h>
void fun_add(int a, int b)
{
int sum = a+ b;
printf("a+b = %d \n", sum);
}


static t_fops fp = {
.add = fun_add,
};

**************************************************************************************************

fun.h


typedef struct fops{

void(*add)(int a, int b);
} t_fops;


*************************************************************************************

[root@arm 2]# make
gcc -g -Wall -O3 -march=i386 -I. -MMD -c -o fun.o fun.c
gcc -g -Wall -O3 -march=i386 -I. -MMD -c -o main.o main.c
main.c: In function ‘main’:
main.c:7: 警告:此函数中的 ‘ts.add’ 在使用前未初始化
gcc -o test fun.o main.o 


*****************************************************************
执行:
[root@arm 2]# ./test 
段错误


**************************************************************
请问,ts.add 要怎么初始化????(我不是已经在fun.c 把 add 函数初始化了吗??)要怎么改??


谢谢
------解决方案--------------------
你在func.c中初始化的是一个t_fops的静态变量fp,而在main函数里面用的是另一个t_fops变量ts,他们是两个变量,ts变量没有初始化。
楼上的修改可以解决你的问题,是正确的用法(推荐)。另一个解决方法是你使用fp变量,而不要再定义新的变量:

main.c:

#include <stdio.h>
#include <fun.h>
int main(void)
{
fp.add(1,2);
return 0;
}


func.c:

#include <fun.h>
#include <stdio.h>
void fun_add(int a, int b)
{
int sum = a+ b;
printf("a+b = %d \n", sum);
}

t_fops fp = {
.add = fun_add,
};


func.h:

typedef struct fops
{   
void(*add)(int a, int b); 
} t_fops;

extern t_fops fp;