整數時,這是我的代碼,Tuple.c,它在該行產生段錯誤有評論這樣說:段錯誤提領從虛空PTR
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
void dbwait();
typedef struct STuple {
int tSize;
void** values;
} Tuple;
Tuple* CreateTuple(int n_args, ...) {
va_list varlist;
va_start(varlist, n_args);
int varsSize;
void** vars = (void**)malloc(n_args * sizeof(void*));
for (int i = 0; i < n_args; i++) {
void* arg = va_arg(varlist, void*);
varsSize += sizeof(arg);
vars[i] = arg;
printf("Arg ptr = %p\n", arg);
}
// Size of all of the arguments + size of an int value (varsSize) since Tuple has an array of void* and a single int.
Tuple* t = (Tuple*)malloc(varsSize + sizeof(varsSize));
t->values = vars;
t->tSize = n_args;
va_end(varlist);
return t;
}
void FreeTuple(Tuple* t) {
printf("Freeing tuple at %p\n", (void*)t);
free(t->values);
free(t);
}
int main(int argc, char** argv) {
Tuple* rt = CreateTuple(3, 625, 173, 50);
int length = rt->tSize;
printf("%i\n", length); // Prints 3, as defined in the call to CreateTuple
dbwait();
for (int i = 0; i < length; i++) {
printf("index = %i: ", i);
dbwait();
void* ptr = rt->values[i];
printf("At ptr %p, ", ptr); dbwait();
int value = *((int*)ptr); // SegFault Occurs here!
printf("with value = %d\n", value);
dbwait();
}
dbwait();
FreeTuple(rt);
return 0;
}
void dbwait() {
char* stop = (char*)malloc(sizeof(char));
scanf("%c", stop);
free(stop);
}
我知道一個事實,即地址分配給ptr
在ptr = rt->values[i];
是正確的,因爲每當我複製該地址作爲其從gdb打印並打印(地址),它打印出正確的值625.
爲什麼我會得到一個SegFault時,地址正確指向一個整數?
編輯:我已經根據其他用戶的要求,用我上面顯示的整個tuple.c文件替換了我的問題的當前代碼內容。
請發表[mcve]。你認爲調用'malloc'的結果是什麼,然後立即覆蓋它在下一行返回的結果?這不是使用'malloc'的正確方法,如果你認爲這是正確的,那麼建議你再次挖掘你的fav C文本。 – kaylum
你介意爲CreateTuple提供代碼嗎?我認爲問題在於它,因爲在你的例子中'malloc'和變量是過度的並且什麼都不做,所以整個例子可以縮寫爲*((int *))CreateTuple(3,625,173,50) - >值[I])'。 – yeputons
你說「我知道所有這些malloc都是過度的」。事實上,他們模糊了你的榜樣。 – jdigital