不太确定,在memcpy上发生了段错误?

时间:2015-10-21 18:51:02

标签: c pointers memory segmentation-fault memcpy

我在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

谁能告诉我哪里出错?

提前致谢

1 个答案:

答案 0 :(得分:1)

rec并未指向任何已分配的内存。取消引用它会产生未定义的行为。行已经

char* ptr = rec->buffer;

结果未定义。

而不是指针,只需定义

record rec;

并初始化ptr,如

char* ptr = rec.buffer;