【问题标题】:C, char** strange outputC、char**奇怪的输出
【发布时间】:2015-09-17 05:22:14
【问题描述】:
#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 中编写和编译它,如果这改变了任何东西

【问题讨论】:

  • 这会调用 很多 未定义的行为、一对一的错误和很多其他的东西。
  • 首先,数组数组与指向指针的指针相同(例如,请参阅this old answer of mine 了解原因)。其次,你仍然返回一个指向局部变量的指针,一旦该函数返回,它就会超出范围。
  • 哦,好吧,我明白你在说什么了,不过你会怎么做呢?还有 .. 我发现如果我只使用其中一个函数,它们就可以工作,但是当我创建数组和字符串数组时,它会自己搞砸,这有什么不同?
  • 未定义的行为是未定义的,真的没什么好说的了。然而,实际上局部变量使用的内存仍然存在于函数返回时的状态,这就是为什么它似乎在只调用一次函数时工作,但是调用 any 其他函数很可能会为新函数调用重用该内存。
  • 至于解决方案,请搜索并了解动态内存分配(并了解mallocfree 函数)。

标签: c arrays pointers output


【解决方案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" 这样的代码没有任何意义。
  • 指向指针的指针不是数组,它们也不指向数组,也不与数组兼容。有很多不正确的书籍和教程在那里教授公然不正确的指针对指针的使用。实际上,您需要使用它的情况很少,二维数组不是其中之一,所以暂时忘记您曾经见过指针对指针。
  • 请注意*(pointer + n) 100% 等同于pointer[n]。后者更易于阅读,因此请尽可能使用该形式。

【讨论】:

  • 非常感谢!这清除了一些很棒的东西!我有数组的基本概念,但这肯定有帮助。我一直很想了解预建函数的工作原理(为什么我不只是想使用 malloc 和 free ),这就是我试图在那里尝试的 ^.. 我想要一个char**,在我制作的另一个简单游戏程序中,是重新制作它,并添加一个日志文件,其中包含发生的所有事情的数组,这将是一个字符串日志数组,但我想我会尝试编写改为文件,看起来更容易哈哈
猜你喜欢
  • 2020-04-23
  • 1970-01-01
  • 2021-09-08
  • 2021-12-03
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
相关资源
最近更新 更多