与this问题相关。
以下代码有什么问题?
typedef char (*p)[20] ptr;
ptr myFunction () {
char sub_str[10][20];
return sub_str;
}
int main () {
ptr str;
str = myFunction();
}
答案 0 :(得分:8)
的句法:强>
更改
typedef char (*p)[20] ptr;
为了
typedef char (*ptr)[20];
要理解像这样的typedef声明的语法。想象一下,您想要将类型T重命名为U.声明一个名为U的T类型的变量,并使用'typedef'作为声明的前缀。就这样。
的语义:强>
查看我和其他相关问题的答案。这仍然是未定义的行为
答案 1 :(得分:4)
当myFunction()返回时,你将返回一个指向内存的指针,该指针将不再存在。
答案 2 :(得分:2)
主要问题是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;
}