#include <stdio.h>
char** StringArray ( int n_size )
{
char* astr_allocate[ n_size ];
char** pstr_string_array = astr_allocate;
int n_count;
for ( n_count = 0; n_count < n_size; n_count++ )
*(pstr_string_array + n_count) = " ";
*(pstr_string_array + n_size) = "\0";
return pstr_string_array;
}
char* String ( int n_size )
{
char ach_allocate[ n_size ];
char* str_string = ach_allocate;
int n_count;
for ( n_count = 0; n_count < n_size; n_count++ )
*(str_string + n_count) = ' ';
*(str_string + n_size) = '\0';
return str_string;
}
void main ()
{
int n_size = 5;
int n_count ;
char* pch_string = String ( n_size );
char** pstr_string = StringArray ( n_size );
for ( n_count = 0; n_count < n_size; n_count++ )
printf ( "%c", *(pch_string + n_count) );
for ( n_count = 0; n_count < n_size; n_count++ )
printf ( "%s", *(pstr_string + n_count) );
printf ( "\n\n" );
}
这会产生“???”的精彩输出(字面上的问号)和类似的随机内容。我只是想更多地了解指针和字符串类型的东西,如果有人可以帮忙那就太好了,谢谢!
另外:一直在 Linux 终端和 Nano 中编写和编译它,如果这改变了什么
最佳答案
我建议你更多地学习数组、指针和字符串。
- 由于此程序是用于常规托管系统 (Linux) 的程序,因此您必须将 main 声明为
int main (void)
。 - C 没有预制的字符串类,C 字符串是字符数组。因此,它们实际上需要被分配到某个地方。您确实尝试将它们分配为函数内的局部变量,但不能返回指向局部变量的指针,因为一旦离开函数,该变量将不再有效。以前为阵列保留的内存现在可能随时用于完全不相关的事情。 See this .
- C 中的数组是零索引的。这意味着给定一个数组
int arr[2];
,项目的索引为[0]和[1]。因此,您无法通过arr[2] = ...
或*(arr + 2) = ...
来访问它,因为它指向超出了数组。 - 给定一个指向字符的指针,该指针指向字符数组(C 字符串),您无法通过执行诸如
*(pstr_string_array + n_count) = ""; 之类的操作来为其分配数据
因为这只会改变指针指向的位置!你什么也没复制。相反,您必须使用strcpy(pointer, "", 2)
。 - 字符串文字
""
与字符数组char arr [2] = {' ', '\0'}
相同。因此像"\0"
这样的代码没有任何意义。 - 指向指针的指针不是数组,也不指向数组,也不与数组兼容。有很多不正确的书籍和教程公然教导指针到指针的错误用法。实际上很少有情况需要使用它,二维数组不是其中之一,所以暂时忘记您曾经见过指针到指针。
- 请注意,
*(pointer + n)
100% 等同于pointer[n]
。后者更容易阅读,因此请尽可能使用该形式。
关于C、char** 奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32623084/