[英]pointer reassignment gives segmentation fault
我在理解為什么我不能對 lastPrefix 進行重新分配時遇到問題,在指定的行上它給了我一個段錯誤。 我似乎缺少一些基本的東西。
char * somefunc(char ** strs, int numStrings)
{
char * lastPrefix;
printf("%d\n", *(strs[0]+0));
printf("%d\n", *(strs[1]+0));
printf("%d\n", *(strs[2]+0));
printf("%d\n", *(strs[0]+1));
printf("%d\n", *(strs[1]+1));
printf("%d\n", *(strs[2]+1));
printf("%d\n", *(strs[0]+2));
printf("%d\n", *(strs[1]+2));
printf("%d\n", *(strs[2]+2));
printf("%d\n", *(strs[0]+0));
printf("%d\n", *(strs[1]+0));
printf("%d\n", *(strs[2]+0)); // ALL IS WELL
*lastPrefix = *(strs[1]+0);
*lastPrefix = *(strs[2]+0);
*lastPrefix = *(strs[0]+1); // WILL SEGMENT FAULT HERE
*lastPrefix = *(strs[1]+1);
*lastPrefix = *(strs[2]+1);
}
int main()
{
char * strs[] = {
"flower", "flow", "flight"
};
char * res = somefunc(strs, SIZEOF(strs));
}
我還可以要求一個很好的 C 指針參考嗎?
當您創建任何變量時,無論是指針還是數據,變量的初始值都會是一些垃圾或 0。在您的情況下,
char *lastPrefix;
就是這樣一個變量,里面包含了一些垃圾值。 你必須使用malloc()
或類似的東西給它一個有效的值。 否則,當您取消引用它 ( *
) 時,它可能指向某個無法訪問甚至不存在的內存位置。 也許它指向你的代碼的中間。 也許它指向NULL。 這樣的記憶在用戶空間中是無法訪問的。 所以,windows(或linux)會殺死你的程序。
你想做什么:
char *lastPrefix;
lastPrefix=malloc(101); //holds strings upto 100 characters
malloc()
將從堆中分配值到您的變量中,程序應該可以正常工作。 只記得最后釋放內存: free(lastPrefix);
int *ptr; // pointer variable declaration */
int kk; // actual variable declaration */
*a = 11; // `a` pointing to unknown memory address and accessing this will give segmentation fault/
a = &kk; *a = 11 // This is valid. store address of `kk` in pointer variable */
同樣,在您的代碼中lastPrefix
指向一個未知地址,訪問它會給您帶來分段錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.