C,char **奇怪的输出

时间:2015-09-17 05:22:15

标签: c arrays pointers 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) = "\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中编写和编译它,如果改变了什么

1 个答案:

答案 0 :(得分:1)

我建议您更多地研究数组,指针和字符串。

  • 由于此程序是常规托管系统(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"这样的代码没有任何意义。
  • 指针指针不是数组,也不指向数组,也不与数组兼容。有很多错误的书籍和教程,教导公然不正确地使用指针到指针。实际上很少有你需要使用它的情况,2D数组不是其中之一,所以忘记你曾经看过指向指针的指针。
  • 请注意,*(pointer + n)pointer[n]完全相同。后者更容易阅读,所以尽可能使用该表格。