当前位置: 技术问答>linux和unix
请教一个段错误的问题!
来源: 互联网 发布时间:2016-03-22
本文导语: 结构体是这样定义的: struct snd_sig_method { uint8_t *(*sign)(struct iovec *, int, int *, void *); int (*verify)(struct iovec *, int, uint8_t *, int, ...
结构体是这样定义的:
struct snd_sig_method {
uint8_t *(*sign)(struct iovec *, int, int *, void *);
int (*verify)(struct iovec *, int, uint8_t *, int,
uint8_t *, int);
void *(*load_key)(const char *);
void (*free_key)(void *);
int (*init)(void);
int (*params_init)(struct snd_cga_params *);
void (*fini)(void);
uint8_t type;
const char *name;
struct list_head list;
};
代码:
#include "common.h"
int main()
{
char *keyfile="keyfile.pem";
struct snd_sig_method *m;
void *key;
if ((key = m->load_key(keyfile)) == NULL)
{
printf("Notice!n");
}
return 0;
}
运行的结果显示:断错误。错误就出现在m->load_key(keyfile) ,是不是没有提前分配内存,我挺菜的,请大家指教!
struct snd_sig_method {
uint8_t *(*sign)(struct iovec *, int, int *, void *);
int (*verify)(struct iovec *, int, uint8_t *, int,
uint8_t *, int);
void *(*load_key)(const char *);
void (*free_key)(void *);
int (*init)(void);
int (*params_init)(struct snd_cga_params *);
void (*fini)(void);
uint8_t type;
const char *name;
struct list_head list;
};
代码:
#include "common.h"
int main()
{
char *keyfile="keyfile.pem";
struct snd_sig_method *m;
void *key;
if ((key = m->load_key(keyfile)) == NULL)
{
printf("Notice!n");
}
return 0;
}
运行的结果显示:断错误。错误就出现在m->load_key(keyfile) ,是不是没有提前分配内存,我挺菜的,请大家指教!
|
何止啊,结构里这么多的函数指针,都需要赋值啊,
至少load_key需要赋值才能调用。
至少load_key需要赋值才能调用。
|
struct snd_sig_method *m;
这个指针还没有设定过值,m的值就是随机数,在执行到m->load_key(keyfile) 的时候,m可能指向任意内存,而那块内存是不能访问的。
所谓的野指针就是这个了。
至少要做出一个struct snd_sig_method 的实体,将m指向该实体。
并且,struct snd_sig_method 实体中的函数指针load_key也必须初始化,指向一个函数。
|
这是一个函数指针结构, 类似于LINUX DEVICE DRIVE里的设备(文件)结构.
结构定义本身没有问题, 问题在于:
struct snd_sig_method *m;
这是创建了一个对象指针, 而不是对象, 需要malloc或者索性struct snd_sig_method m;
如果是对象的话:
if ((key = m->load_key(keyfile)) == NULL)
改成:
if ((key = m.load_key(keyfile)) == NULL)
就可以了.
如果是对象指针的话
struct snd_sig_method *m;
m = (struct snd_sig_method *)malloc(sizeof(struct snd_sig_method));
总体来说, 只是没有分配内存的问题, 指针在没有分配内存时, 他本身只是一个指针, 不存在成员, 初始化后也没有地址.
结构定义本身没有问题, 问题在于:
struct snd_sig_method *m;
这是创建了一个对象指针, 而不是对象, 需要malloc或者索性struct snd_sig_method m;
如果是对象的话:
if ((key = m->load_key(keyfile)) == NULL)
改成:
if ((key = m.load_key(keyfile)) == NULL)
就可以了.
如果是对象指针的话
struct snd_sig_method *m;
m = (struct snd_sig_method *)malloc(sizeof(struct snd_sig_method));
总体来说, 只是没有分配内存的问题, 指针在没有分配内存时, 他本身只是一个指针, 不存在成员, 初始化后也没有地址.