與this相關的問題。Typedef和C中的複合聲明
以下代碼有什麼問題?
typedef char (*p)[20] ptr;
ptr myFunction() {
char sub_str[10][20];
return sub_str;
}
int main() {
ptr str;
str = myFunction();
}
與this相關的問題。Typedef和C中的複合聲明
以下代碼有什麼問題?
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;
}