感谢。
答案 0 :(得分:4)
Segfault可能是由许多事情引起的。你在malloc之后检查指针(如果它是NULL)?逐步查看代码行,看看它到底发生了什么(并提出更详细和代码的单独问题)
您似乎不理解C中指针和数组的关系。首先,指向指针数组的指针定义为type***
或type**
[]。实际上,只有两次间接指针才有用。不过,你可以有这样的东西,只需要取消引用指针足够的时间并进行实际的内存分配。
这很麻烦。应该是一个单独的问题。
他们很可能会崩溃你的程序,但这是未定义的,所以你不能确定。它们可能具有已使用的内存“插槽”的地址,因此可能存在您甚至没有注意到的错误。
答案 1 :(得分:1)
答案 2 :(得分:1)
如果没有看到一些代码,很难回答你的第一个问题 - 分段错误很难追踪并且看到代码会更直接。
双指针并不比单指针更特殊,因为它们背后的概念是相同的。例如......
char * c = malloc(4);
char **c = &c;
我不太确定c)在问什么,但是为了回答你的最后一个问题,未初始化的指针在C中有未定义的动作,即。你不应该依赖任何具体的结果。
编辑:自从我回复后,您似乎添加了一个问题......strcpy(..)确实会将源字符串的null终止符复制到目标字符串。
答案 3 :(得分:1)
对于'a'部分,也许这会有所帮助:
void myfunction(void) {
int * p = (int *) malloc (sizeof(int));
free(p);
}
int main () {
int i;
for (i = 0; i < 1000; i++)
myfunction();
return 0;
}
Here是对斯坦福大学指针的一个很好的介绍。
答案 4 :(得分:1)
指针是一种特殊类型的变量,它保存另一个变量的地址或位置。指针通过记录它们存储的位置来指向这些位置。通过记录存储变量的地址来找到变量的指针。总是可以使用特殊的&amp; amp;找到C中的存储地址。运营商。例如:如果location
是一个浮点类型变量,那么很容易找到一个名为location_ptr
的指针
float location;
float *location_ptr,*address;
location_ptr = &(location);
或
address = &(location);
指针的声明起初看起来有点奇怪。位于变量名称前面的星号*符号是C声明该变量为指针的方式。上面的四行使得两个相同的指针指向称为位置的浮点变量,其中一个称为location_ptr
,另一个称为address
。关键是指针只是一个记录变量地址的地方,所以它们实际上是一样的。
指针是一组包含两部分的信息。一部分是内存段开头的地址,它包含指向的内容。另一部分是指针指向开头的值的类型。这告诉计算机在开始阅读之后有多少内存以及如何解释它。因此,如果指针的类型为int,则返回的内存段将为四个字节长(32位)并被解释为整数。在函数的情况下,类型是函数将返回的值的类型,尽管地址是函数可执行文件开头的地址。
上获得更多关于C / C ++编程的教程答案 5 :(得分:0)
您已添加了有关strcpy / strncpy的其他问题。
strcpy实际上更安全。 它复制一个以nul结尾的字符串,并将nul终止符添加到副本中。即你得到原始字符串的完全重复。
另一方面,strncpy有两种截然不同的行为:char dest[123]; strncpy(dest, source, 123); dest[122] = '\0';