У меня проблема с реализацией оператора push_back для универсального вектора с изменяемым размером в c. Для универсальности мне нужно использовать указатель 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
вычисляется по адресу временного объекта, не так ли? - person   schedule 26.12.2013-O1
или когда я используюmemcpy
? - person user1483596   schedule 26.12.2013tmp = value
, но по-прежнему передает &tmp в smemcpy. - person Mark Plotnick   schedule 26.12.2013