C语言中的typedef和复杂声明

3

以下代码有什么问题?

这个问题相关。

typedef char (*p)[20] ptr;
ptr myFunction () {

    char sub_str[10][20]; 
    return sub_str;

} 

int main () {

    ptr str;
    str = myFunction();

}
3个回答

8

从语法上来说:

typedef char (*p)[20] ptr;
改为
typedef char (*ptr)[20];

理解这种typedef声明的语法。想象一下你想将类型T重命名为类型U。声明一个名为U的T类型变量,并在声明前加上'typedef'即可。

从语义上来说:
请参考我的和其他人对您链接问题的答案。这仍然是未定义的行为。


4

你正在返回一个指向内存的指针,但是当myFunction()函数返回时,该内存将不存在。


2
主要问题在于substr局限于myFunction,一旦myFunction退出,它就不存在了,因此您返回的指针将不再有效。
其次,您没有正确使用typedef。 正确的语法应该是:
typedef char (*ptr)[20];

从语法上来说,typedef 基本上像 staticextern 一样作为存储类限定符(尽管语义不同)。基本上,您需要找出对象的声明。
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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接