C中的Typedef和复杂声明

时间:2010-11-03 09:06:47

标签: c

this问题相关。

以下代码有什么问题?

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

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

} 

int main () {

    ptr str;
    str = myFunction();

}

3 个答案:

答案 0 :(得分:8)

句法:
更改
 typedef char (*p)[20] ptr;
为了
 typedef char (*ptr)[20];

要理解像这样的typedef声明的语法。想象一下,您想要将类型T重命名为U.声明一个名为U的T类型的变量,并使用'typedef'作为声明的前缀。就这样。

语义:
 查看我和其他相关问题的答案。这仍然是未定义的行为

答案 1 :(得分:4)

当myFunction()返回时,你将返回一个指向内存的指针,该指针将不再存在。

答案 2 :(得分:2)

主要问题是substrmyFunction的本地问题,一旦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;
}