【发布时间】:2014-01-13 16:18:58
【问题描述】:
我在为 c 中的通用可调整大小向量实现 push_back 运算符时遇到问题。为了通用性,我需要使用 void 指针作为参数,但实际上我想直接给它赋值。
当我用gcc -o t test.c -std=c99 编译下面的代码时,它会按我的预期打印10。
当我将-O1(或更高版本)添加到编译选项时,程序会打印0。
我认为问题出在smemcpy 代码中,因为当我用memcpy 替换它时,我不再有这个问题。
简化代码:
#include <stdio.h>
#include <stdlib.h>
#define get_pointer(value) ({ __typeof__(value) tmp = value; &tmp; })
// copy from src to dst byte by byte
void* smemcpy(void* dst, void const * src, size_t len) {
char * pdst = (char *) dst;
char const * psrc = (char const *) src;
while (len--) {
*pdst++ = *psrc++;
}
return (dst);
}
int main() {
void* container = malloc(sizeof(int));
// copy a 10 into the container via a temporary pointer
smemcpy(container, get_pointer(10), sizeof(int));
printf("%d\n", ((int*)container)[0]);
return 0;
}
提前感谢您的帮助,
B
【问题讨论】:
-
您的
get_pointer语句块正在评估临时对象的地址,不是吗? -
今天第二个此类问题,两天内第三个。
-
@hwd 如果这是一个临时对象问题,为什么没有
-O1或者当我使用memcpy时它会起作用? -
@user1483596:未定义的行为。
-
我查看了汇编代码。带有 -O1 的 gcc 优化了
tmp = value分配,但仍将 &tmp 传递给 smemcpy。
标签: c generics gcc vector memcpy