【发布时间】: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 其他函数很可能会为新函数调用重用该内存。