c – 使用memcpy()复制包含指针的结构是否可以?

c – 使用memcpy()复制包含指针的结构是否可以?,第1张

概述前几天我在考虑这件事,如果这是一个坏主意我很好奇…… 可以说有一个结构包含一个指向字符串数组的指针. memcpy()会复制下面示例中的’name’数组指针吗? 编辑:此示例中无法访问std. struct charMap{ unsigned char * name; unsigned char id; };typedef struct charMap CharM 前几天我在考虑这件事,如果这是一个坏主意我很好奇……
可以说有一个结构包含一个指向字符串数组的指针.
memcpy()会复制下面示例中的’name’数组指针吗?
编辑:此示例中无法访问std.

struct charMap{   unsigned char * name;     unsigned char ID;       };typedef struct charMap CharMapT;class ABC{  public:  ABC(){}  voID Function();  CharMapT* structList;}voID ABC::Function (){  CharMapT List[] =   {    {"name1",1},{"name2",2},{"name3",3}  };  structList = new CharMapT[sizeof(List)];  memcpy(structList,&List,sizeof(List));}
解决方法 在我们将要讨论的代码中存在几个错误,我将首先讨论这个错误,然后是指针与数组的股票dia骂.

struct charMap{   unsigned int * name;     unsigned int ID;       };typedef struct charMap CharMapT;

这声明了一种结构类型,其中包含指向unsigned int的指针作为第一个成员(name),int作为第二个成员(ID).在具有默认字节打包的32位系统上,这将是8字节宽(32位指针= 4字节,32位符号int = 4字节).如果这是一个64位机器,指针将是8字节宽,int仍然可能是32位宽,使结构大小为12字节.

可疑代码

voID ABC::Function (){  CharMapT List[] =   {    {"name1",sizeof(List));}

这将分配CharMapT结构的动态数组.多少?比你想象的更多. sizeof(List)将返回List []数组的字节数.由于CharMapT结构宽度为8个字节(见上文),因此这将是3 * 8或24个CharMapT项目(如果使用64位指针则为36项).

然后我们将memcpy()从列表中的24个字节(或36个字节)(& in& List是不必要的)到新分配的内存.这将复制3个CharMapT结构,留下我们分配的其他21个(超出其初始默认构造).

注意:您正在将const char *初始化为声明为unsigned int *的字段,因此如果这甚至编译了基本数据类型将是不同的.假设您修改了结构并将指针类型更改为const char *,则const数据段中某处的静态字符串常量地址(“name”常量的地址)将分配给structList中元素的指针变量[0] .name,structList [2] .name和structList [3] .name分别.

这不会复制指向的数据.它只会复制指针值.如果你想要数据的副本,那么你必须对它们进行原始分配(malloc,new,等等).

更好的是,使用std :: vector< CharMapT>,使用std :: string作为CharMapT :: name,并使用std :: copy()复制源(甚至直接赋值).

我希望能解释你在寻找什么.

指针与阵列Diatribe

切勿将指针与数组混淆.指针是保存地址的变量.就像一个int变量保存一个整数值,或者一个char变量保存一个字符类型,指针中保存的值就是一个地址

数组是不同的.它也是一个变量(显然),但它不能是l值,几乎每个地方通常都会使用转换.从概念上讲,转换会产生一个指向数组数据类型的临时指针,并保存第一个元素的地址.有时候这个概念不会发生(例如应用地址运算符).

voID foo(const char * p){}char ar[] = "Hello,World!";foo(ar); // passes 'ar',converted to `char*`,into foo.          // the parameter p in foo will *hold* this address

或这个:

char ar[] = "Goodbye,World!";const char *p = ar;  // ok. p Now holds the address of first element in ar++p;                 // ok. address in `p` changed to address (ar+1)

但不是这个:

char ar[] = "Goodbye,World!";++ar; //  error. nothing to increment.
总结

以上是内存溢出为你收集整理的c – 使用memcpy()复制包含指针的结构是否可以?全部内容,希望文章能够帮你解决c – 使用memcpy()复制包含指针的结构是否可以?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1220966.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存