我在memcpy抛出分段错误方面遇到了一些麻烦,我似乎无法找到错误的来源。
typedef struct {
int record_code;
char* record_name;
char buffer[6004];
} record;
record* rec;
char* ptr = rec->buffer;
//--DEBUG
printf("ADDR OF PTR: %p\n", ptr);
printf("SIZE OF BUFFER: %d\n", sizeof(ptr->buffer));
//--End DEBUG
create_record(ptr);
我想在我的缓冲区中添加一个int值,但是我在这一行上得到了一个SEGFAULT
memcpy(ptr, &key, sizeof(key));
在这个函数中
int counter = 0;
int create_record(char* ptr) {
int key = counter;
//--DEBUG
printf("ADDR OF PTR: %p\n", ptr);
printf("SIZE OF KEY: %d\n", sizeof(key));
//--End DEBUG
memcpy(ptr, &key, sizeof(key));
ptr += sizeof(key);
int integer = rand_int();
memcpy(ptr, &integer, sizeof(integer));
ptr += sizeof(integer);
char* word = rand_string();
memcpy(ptr, word, strlen(word));
ptr += strlen(word);
counter++;
}
我能想到memcpy抛出段错误的唯一原因是,如果任何一个指针都是垃圾,或者我试图扔进内存位置的东西的大小大于我分配的内存。但我只是试图将一个整数(大小= 4个字节)放入一个分配给6004字节的缓冲区中,所以它似乎不是一个大小问题...而且我指针的地址与它匹配的是什么最初创建时(我不确定这是否真的很重要......)。
我从印刷品中得到的输出是
ADDR OF PTR: 0x10
SIZE OF BUFFER: 64004
(now inside create_record)
ADDR OF PTR: 0x10
SIZE OF KEY: 4
谁能告诉我哪里出错?
提前致谢
答案 0 :(得分:1)
rec
并未指向任何已分配的内存。取消引用它会产生未定义的行为。行已经
char* ptr = rec->buffer;
结果未定义。
而不是指针,只需定义
record rec;
并初始化ptr
,如
char* ptr = rec.buffer;