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]。后者更容易阅读,因此尽可能使用该形式。