以下代码有什么问题?
与这个问题相关。
typedef char (*p)[20] ptr;
ptr myFunction () {
char sub_str[10][20];
return sub_str;
}
int main () {
ptr str;
str = myFunction();
}
从语法上来说:
将
typedef char (*p)[20] ptr;
改为
typedef char (*ptr)[20];
理解这种typedef声明的语法。想象一下你想将类型T重命名为类型U。声明一个名为U的T类型变量,并在声明前加上'typedef'即可。
从语义上来说:
请参考我的和其他人对您链接问题的答案。这仍然是未定义的行为。
你正在返回一个指向内存的指针,但是当myFunction()函数返回时,该内存将不存在。
substr
局限于myFunction
,一旦myFunction
退出,它就不存在了,因此您返回的指针将不再有效。typedef
。 正确的语法应该是:typedef char (*ptr)[20];
typedef
基本上像 static
或 extern
一样作为存储类限定符(尽管语义不同)。基本上,您需要找出对象的声明。char (*ptr)[20]; // ptr is a pointer to a 20-element array of char
然后将 typedef
添加到其中:
typedef char (*ptr)[20];
某种程度上,myFunction
需要以一种方式分配内存,使其在函数退出后不会立即被销毁。 这里有一个选项:
typedef char (*ptr)[20];
ptr myFunction(size_t count)
{
/**
* Dynamically allocate a block of N 20-element arrays of char
*/
ptr p = malloc(sizeof *ptr * count);
return p;
}
int main(void)
{
ptr str = myFunction(10);
size_t i, j;
for (i = 0; i < 10; i++)
for (j = 0; j < 20; j++)
str[i][j] = ...;
...
free(str);
return 0;
}