C、char** 奇怪的输出

标签 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 中编写和编译它,如果这改变了什么

最佳答案

我建议你更多地学习数组、指针和字符串。

  • 由于此程序是用于常规托管系统 (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/

相关文章:

javascript - 如何连接数组中同一元素的多个属性?

c++ - 复杂 C 语法的含义

mysql c api : inserting numbers without converting them to a string

c - 使用 strcmp 比较字符串与直接比较字符

arrays - 使用 VBA(线性方程组)的矩阵数学

arrays - Swift,如何从数组中删除一系列元素

c++ - 指针的指针c++ char初始化

c - 小端和大端中 int 的地址是否相同?

C 多个数据类型传递给同一个函数

objective-c - 快速找到数字的下一个倍数的方法