如何使用memcpy返回从函数修改的两个数组?

问题描述 投票:-4回答:2

由于函数和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;
}

问题是什么 ?我不明白这个错误。

c++ c
2个回答
1
投票

我尝试复制两个数组

问题是什么 ?

问题是你的程序中没有“两个数组”。只有一个数组,tabtest函数的本地。

你的程序使用tab1tab2指针的值而不初始化它们。因此,程序的行为是不确定的。

Segmentation fault (core dumped)

我不明白这个错误。

该错误意味着您的程序试图访问它不应该访问的内存段,并且操作系统因此终止了该进程。这是操作系统防止程序任意行为的一种方式。当程序有未定义的行为时,有时会发生这种情况。


修复程序的最简单方法可能是将tab1tab2声明为数组,而不是未初始化的指针:

uint8_t tab1[2];
uint8_t tab2[2];

0
投票

稍微更改示例代码会显示错误和解决方案

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和目标大小需要相同或检查是否超出。

© www.soinside.com 2019 - 2024. All rights reserved.