[英]malloc error in struct (C)
我在C頭中有以下代碼
typedef struct {
kiss_fft_scalar r;
kiss_fft_scalar i;
} kiss_fft_cpx;
我在測試程序中實現了以下代碼
kiss_fft_cpx *fin = malloc(4*sizeof(kiss_fft_cpx));
它給了我錯誤信息:“void類型的值不能用於初始化'kiss_fft_ctx'類型的實體”。
我正在使用Visual Studio C / C ++ win32控制台項目。
誰能告訴我如何在這里正確使用malloc? 謝謝!
你需要像這樣強制轉換返回類型:
kiss_fft_cpx *fin = (kiss_fft_cpx*) malloc(4*sizeof(kiss_fft_cpx));
但這意味着您將代碼編譯為C ++而不是C,因為這是C ++錯誤而不是C錯誤。 您可能想要檢查文件擴展名和/或編譯器設置。
如果你真的使用 C ++,你至少應使用new
,而不是malloc
:
kiss_fft_cpx *fin = new kiss_fft_cpx[4];
並且理想情況下重新考慮是否需要像這樣動態創建對象 - 你可以使用std::vector
或類似的嗎?
在C中,您可以轉換malloc
返回的void指針。 C為你做這件事,但你也可以明確。
malloc
返回void *
或void指針,然后程序員可以將此返回值轉換為其他指針類型。 或者程序員可以依靠C來進行類型轉換。 使用演員表的C類型轉換預計不會改變。
但是,依賴於C編譯器的C代碼可能會很難以閱讀。 開發程序員可以幫助最終必須閱讀代碼的維護程序員。
向malloc
的返回值添加顯式malloc
可以幫助必須閱讀代碼並確定作者意圖的人。 這是明確地轉換malloc
返回的void指針的真正好處。 這種編程實踐不會誤導編譯器或使用可能會改變的某些神秘的編譯器功能。
以下三個例子突出了這種編程實踐。 在第一個示例中, malloc
(在<stdlib.h>
定義)顯式強制轉換,並執行一些簡單的工作。
#include <stdlib.h>
#define nr_chars 4
main()
{
char *data;
data = (char *) malloc(nr_chars*sizeof(char));
*data++ = 'a';
*data++ = 'b';
*data++ = 'c';
*data++ = '\0'; // it is allowed to go one past an array
data -= nr_chars; // back to the front of data
printf("%s\n", data);
// prints abc at the console
}
在第二個例子中,唯一的區別是<stdlib.h>
被注釋掉了。 代碼仍然運行並產生相同的結果。 現在,為什么這個有效的“原因”是相當直接的。 當C沒有找到函數的原型時,它假定函數返回一個int
,但malloc
返回一個void指針。 在這種情況下,顯式轉換已經告訴C編譯器以及源的碳單元, malloc
返回的值應該轉換為字符指針。
//#include <stdlib.h>
#define nr_chars 4
main()
{
char *data;
data = (char *) malloc(nr_chars*sizeof(char));
*data++ = 'a';
*data++ = 'b';
*data++ = 'c';
*data++ = '\0'; // it is allowed to go one past an array
data -= nr_chars; // back to the front of data
printf("%s\n", data);
// prints abc at the console
}
最后(是的)示例不發出<stdlib.h>
,也不包括<stdlib.h>
。 Eclipse編輯器和編譯器都抱怨這個代碼(正如他們應該的那樣)。 編譯器消息是
..\main.c(18) : warning C4047: '=' : 'char *' differs in levels of indirection from 'int'
源代碼是:
//#include <stdlib.h>
#define nr_chars 4
main()
{
char *data;
data = malloc(nr_chars*sizeof(char));
*data++ = 'a';
*data++ = 'b';
*data++ = 'c';
*data++ = '\0'; // it is allowed to go one past an array
data -= nr_chars; // back to the front of data
printf("%s\n", data);
// compiler displays a "warning" and prints abc at the console
}
更改示例3以包含沒有警告的結果,程序按預期運行。 但是,示例2和3都缺少顯式強制轉換,並且在使用此樣式編寫的代碼的生命周期內,此類代碼將更加昂貴,並且更可能被人類錯誤地更改(因此額外費用),而不是顯式使用由C編譯器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.