C中的指针初始化和字符串操作

时间:2009-09-25 17:46:37

标签: c pointers string segmentation-fault

  1. 我有这个函数,从main()调用大约1000次。当我使用malloc()初始化此函数中的指针时,会发生seg错误,可能是因为我在离开函数之前没有释放它()。现在,我在返回main之前尝试free()指针,但没有用,最终发生了seg错误。
    1. 上面的场景是一回事,我如何初始化双指针(** ptr)和指向指针数组的指针(* ptr [])?
    2. 有没有办法将字符串(char数组)复制到char指针数组中。 char arr []; (可以说有五十个这样的数组) char * ptr_arr [50];现在我想在* ptr_arr []中指出每个这样的char arr [] 我如何在这里初始化char * ptr_arr []?
    3. C中未初始化指针的影响是什么?
    4. strcpy()会自己附加'\ 0'还是我们必须手动执行?与strncpy()相比,strcpy()的安全性如何?跟strcat()和strncat()一样明智。
  2. 感谢。

6 个答案:

答案 0 :(得分:4)

  1. Segfault可能是由许多事情引起的。你在malloc之后检查指针(如果它是NULL)?逐步查看代码行,看看它到底发生了什么(并提出更详细和代码的单独问题)

  2. 您似乎不理解C中指针和数组的关系。首先,指向指针数组的指针定义为type***type** []。实际上,只有两次间接指针才有用。不过,你可以有这样的东西,只需要取消引用指针足够的时间并进行实际的内存分配。

  3. 这很麻烦。应该是一个单独的问题。

  4. 他们很可能会崩溃你的程序,但这是未定义的,所以你不能确定。它们可能具有已使用的内存“插槽”的地址,因此可能存在您甚至没有注意到的错误。

答案 1 :(得分:1)

根据你的问题,我的建议是谷歌“C指针”并阅读一些教程,以了解指针是什么以及如何使用它们 - 有很多需要在SO回答中重复让你加快速度。

前两个匹配是herehere

答案 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位)并被解释为整数。在函数的情况下,类型是函数将返回的值的类型,尽管地址是函数可执行文件开头的地址。

还可以在http://www.jnucode.blogspot.com

上获得更多关于C / C ++编程的教程

答案 5 :(得分:0)

您已添加了有关strcpy / strncpy的其他问题。

strcpy实际上更安全。 它复制一个以nul结尾的字符串,并将nul终止符添加到副本中。即你得到原始字符串的完全重复。

另一方面,strncpy有两种截然不同的行为:

  • 如果源字符串长度小于'n'个字符,则表示strcpy,nul终止副本
  • 如果源字符串长度大于或等于'n'个字符,那么它只是在到达'n'时停止复制,并保留字符串 unterminated 。因此,必须始终对结果字符串进行nul-terminate以确保它仍然有效:
    char dest[123];
    strncpy(dest, source, 123);
    dest[122] = '\0';