C、char**奇怪的输出
C, char** strange output
#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) = "[=10=]";
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) = '[=10=]';
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没有预制字符串class,C字符串是字符数组。因此,它们实际上需要分配到某个地方。您确实尝试将它们分配为函数内的局部变量,但是您不能 return 指向局部变量的指针,因为一旦您离开该函数,该变量将不再有效。以前为您的阵列保留的内存现在可以随时用于完全不相关的事情。 See this.
- C 中的数组是零索引的。这意味着给定一个数组
int arr[2];
项目具有索引 [0] 和 [1]。因此,您不能以 arr[2] = ...
或 *(arr + 2) = ...
的形式访问它,因为它指向数组的末尾。
- 给定一个指向字符的指针,它指向一个字符数组(C 字符串),您不能通过
*(pstr_string_array + n_count) = " ";
之类的操作为其分配数据,因为这只会改变指针指向的位置!你什么都不抄。相反,您必须使用 strcpy(pointer, " ", 2)
.
- 字符串文字
" "
与字符数组 char arr [2] = {' ', '[=17=]'}
相同。所以像 "[=18=]"
这样的代码没有任何意义。
- 指向指针的指针不是数组,也不指向数组,也不兼容数组。有很多 很多 不正确的书籍和教程教导指针到指针的公然错误使用。实际上很少有需要使用它的情况,2D 数组不是其中之一,所以暂时忘掉你曾经见过的指针到指针吧。
- 请注意
*(pointer + n)
100% 等同于 pointer[n]
。后者更容易阅读,因此尽可能使用该形式。
#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) = "[=10=]";
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) = '[=10=]';
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没有预制字符串class,C字符串是字符数组。因此,它们实际上需要分配到某个地方。您确实尝试将它们分配为函数内的局部变量,但是您不能 return 指向局部变量的指针,因为一旦您离开该函数,该变量将不再有效。以前为您的阵列保留的内存现在可以随时用于完全不相关的事情。 See this.
- C 中的数组是零索引的。这意味着给定一个数组
int arr[2];
项目具有索引 [0] 和 [1]。因此,您不能以arr[2] = ...
或*(arr + 2) = ...
的形式访问它,因为它指向数组的末尾。 - 给定一个指向字符的指针,它指向一个字符数组(C 字符串),您不能通过
*(pstr_string_array + n_count) = " ";
之类的操作为其分配数据,因为这只会改变指针指向的位置!你什么都不抄。相反,您必须使用strcpy(pointer, " ", 2)
. - 字符串文字
" "
与字符数组char arr [2] = {' ', '[=17=]'}
相同。所以像"[=18=]"
这样的代码没有任何意义。 - 指向指针的指针不是数组,也不指向数组,也不兼容数组。有很多 很多 不正确的书籍和教程教导指针到指针的公然错误使用。实际上很少有需要使用它的情况,2D 数组不是其中之一,所以暂时忘掉你曾经见过的指针到指针吧。
- 请注意
*(pointer + n)
100% 等同于pointer[n]
。后者更容易阅读,因此尽可能使用该形式。