我有一大块内存,我将这些内存的一些内容传递给这些函数:
void setBlockSize(char* node, int size) { printf("need size: %i\n",size); memcpy(node, (void *)&size, sizeof(size)); printf("set to: %i\n",node); } //written for 4 byte pointer, 32 bit addressing void setNextPointer(char* node, char* next){ printf("need ptr: %p\n", next); memcpy((node+4), (void*)&next, sizeof(next)); printf("next: %p, set: %p\n",next, (void*)(node+4)); }我的输出如下:
need size: 8296 set to: 137666560 need ptr: (nil) next: (nil), set: 0x834a004 need size: 137666456 set to: 137666560 need ptr: 0xffee4874 next: 0xffee4874, set: 0x834a004 need size: 104 zsh: segmentation fault (core dumped) ./mallocTest似乎设置了错误的值(我试图设置一个指针和一个整数。这对memcpy来说是不正确的用法?
I have a large block of memory and I am passing bits of this memory to these functions:
void setBlockSize(char* node, int size) { printf("need size: %i\n",size); memcpy(node, (void *)&size, sizeof(size)); printf("set to: %i\n",node); } //written for 4 byte pointer, 32 bit addressing void setNextPointer(char* node, char* next){ printf("need ptr: %p\n", next); memcpy((node+4), (void*)&next, sizeof(next)); printf("next: %p, set: %p\n",next, (void*)(node+4)); }My output is as follows:
need size: 8296 set to: 137666560 need ptr: (nil) next: (nil), set: 0x834a004 need size: 137666456 set to: 137666560 need ptr: 0xffee4874 next: 0xffee4874, set: 0x834a004 need size: 104 zsh: segmentation fault (core dumped) ./mallocTestIt appears that the wrong values are being set (I am trying to set a pointer, and an integer. Is this not correct usage for memcpy?
最满意答案
在第一个函数中,当您输出刚写入的值时,不会取消引用指针。 尝试这个:
printf("set to: %i\n", *(int*)node);第二个功能中存在同样的问题。 您想要输出存储在指针node+4内的指针值,而不是node+4本身:
printf("next: %p, set: %p\n", next, *(void*)(node+4));关于memcpy ,使用它来编写单个值很奇怪。 你可以避免像这样的memcpy :
*(int*)node = size; *(char**)(node+4) = next;In the first function, you are not dereferencing the pointer when you output the value you just wrote to. Try this:
printf("set to: %i\n", *(int*)node);Same problem is present in the second function. You want to output the pointer value stored inside the pointer node+4, not node+4 itself:
printf("next: %p, set: %p\n", next, *(void*)(node+4));Just regarding memcpy, it's strange to use it for writing a single value. You can avoid memcpy like this:
*(int*)node = size; *(char**)(node+4) = next;更多推荐
发布评论