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

谢谢。

4

6 回答 6

4
  1. 段错误可能是由很多事情引起的。您是否检查 malloc 之后的指针(如果它为 NULL)?逐行查看代码的确切位置(并提出一个包含更多详细信息和代码的单独问题)

  2. 您似乎不了解 C 中指针和数组的关系。首先,指向指针数组的指针定义为类似type***or type**[]。在实践中,只有两次间接指针是有用的。尽管如此,您仍然可以拥有这样的东西,只需将指针取消引用足够多次并进行实​​际的内存分配。

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

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

于 2009-09-25T17:57:45.090 回答
1

根据您的问题,我的建议是谷歌“C 中的指针”并阅读一些教程以了解指针是什么以及如何使用它们 - 在 SO 答案中需要重复很多内容才能让您起床加速。

前两个热门歌曲在这里这里

于 2009-09-25T17:53:30.840 回答
1

没有看到一些代码就很难回答你的第一个问题——分段错误很难追踪,而看到代码会更直接。

双指针并不比单指针更特别,因为它们背后的概念是相同的。例如...

char * c = malloc(4);
char **c = &c;

我不太确定 c) 在问什么,但要回答你的最后一个问题,未初始化的指针在 C 中具有未定义的操作,即。你不应该依赖发生的任何特定结果。

编辑:自从我回答后,您似乎添加了一个问题...

strcpy(..) 确实会将源字符串的空终止符复制到目标字符串。

于 2009-09-25T17:54:27.360 回答
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;
}

是对斯坦福指针的一个很好的介绍。

于 2009-09-25T17:57:06.493 回答
1

指针是一种特殊类型的变量,它保存另一个变量的地址或位置。指针通过记录存储它们的位置来指向这些位置。通过记录变量存储的地址可以找到指向变量的指针。总是可以使用特殊的 & 运算符在 C 中找到一块存储的地址。例如:如果location是浮点类型变量,很容易找到指向它的指针,称为location_ptr

float location;
float *location_ptr,*address;

location_ptr = &(location);

或者

 address = &(location);

指针的声明起初看起来有点奇怪。变量名前面的星 * 符号是 C 将该变量声明为指针的方式。上面的四行创建了两个相同的指针,指向一个名为 location 的浮点变量,其中一个被调用location_ptr,另一个被调用address。关键是指针只是一个记录变量地址的地方,所以它们实际上是一回事。

指针是包含两部分的信息束。一部分是内存段的开头地址,该地址包含所指向的任何内容。另一部分是指针指向开头的值的类型。这告诉计算机在开始读取后有多少内存以及如何解释它。因此,如果指针是 int 类型,则返回的内存段将是四个字节长(32 位)并被解释为整数。在函数的情况下,类型是函数将返回的值的类型,尽管地址是函数可执行文件的开头地址。

还可以在http://www.jnucode.blogspot.com上获得更多关于 C/C++ 编程的教程

于 2011-06-12T14:24:20.907 回答
0

您添加了一个关于 strcpy/strncpy 的附加问题。

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

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

  • 如果源字符串的长度少于 'n' 个字符,它就像 strcpy,nul 终止副本
  • 如果源字符串的长度大于或等于“n”个字符,那么它会在到达“n”时停止复制,并保留字符串unterminated。因此,有必要始终对结果字符串进行 nul 终止以确保它仍然有效:
    字符目的地[123];
    strncpy(目标,源,123);
    目的地[122] = '\0';
于 2009-09-25T18:11:23.690 回答