由于函数和memcpy,我尝试复制两个数组。测试函数必须返回两个修改过的数组。
第一个数组被正确复制,但当我尝试用memcpy做同样的事情到第二个时,有一个Segmentation fault (core dumped)
。
示例代码:
void test(uint8_t* payload, uint8_t* element_size){
uint8_t tab[2];
tab[0] = 1;
tab[1] = 2;
memcpy(payload, tab, sizeof(tab));
memcpy(element_size, tab, sizeof(tab));
}
int main(){
uint8_t* tab1;
uint8_t* tab2;
test(tab1, tab2);
return 0;
}
问题是什么 ?我不明白这个错误。
我尝试复制两个数组
问题是什么 ?
问题是你的程序中没有“两个数组”。只有一个数组,tab
是test
函数的本地。
你的程序使用tab1
和tab2
指针的值而不初始化它们。因此,程序的行为是不确定的。
Segmentation fault (core dumped)
我不明白这个错误。
该错误意味着您的程序试图访问它不应该访问的内存段,并且操作系统因此终止了该进程。这是操作系统防止程序任意行为的一种方式。当程序有未定义的行为时,有时会发生这种情况。
修复程序的最简单方法可能是将tab1
和tab2
声明为数组,而不是未初始化的指针:
uint8_t tab1[2];
uint8_t tab2[2];
稍微更改示例代码会显示错误和解决方案
void test(int* payload, int* element_size){
int tab[2];
tab[0] = 1;
tab[1] = 2;
memcpy(payload, tab, sizeof(tab));
tab[1] = 4;
memcpy(element_size, tab, sizeof(tab));
}
int main(){
int* tab1; // just a pointer.
int* tab2;
printf ("Before tab1=%x, tab2=%x\n",tab1,tab2);
tab1 = malloc(2*sizeof(int)); // Now the pointer points to some storage
tab2 = malloc(2*sizeof(int));
test(tab1, tab2); // Pass addresses to int storage locations
printf ("After tab1=%x, tab2=%x\n",tab1,tab2);
printf ("tab1[0]=%d, tab1[1]=%d\n",*tab1,*tab1+1);
printf ("tab2[0]=%d, tab2[1]=%d\n",tab2[0],tab2[1]);
return 0;
}
当运行时,这给出了
$ ./ptr3
Before tab1=ea32daf8, tab2=0
After tab1=5f4002e0, tab2=5f400340
tab1[0]=1, tab1[1]=2
tab2[0]=1, tab2[1]=4
tab2是一个未定义的变量,从值0开始.memcpy尝试将数据复制到内存位置0,这是分段违例。当指针指向某些存储位置并使用Malloc时,memcopy可以工作。
在子程序'tab'中是一个2个整数的数组,但是tab1和tab2是代码主体中的单个指针位置。 Memcpy使用本地结构选项卡[2]的大小,并假设目标有效负载(这是一对int的地址)足够大。这可能会成为经典的缓冲区溢出错误。
HINT1最好不要为两个截然不同的结构使用相同名称的“tab”。 HINT2 memcpy src和目标大小需要相同或检查是否超出。