指针重新分配给出了分段错误
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
指向一个未知地址,访问它会出现段错误。
我无法理解为什么我无法对 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
指向一个未知地址,访问它会出现段错误。