[英]Passing a pointer to an int array to a c-function
我有一個非常基本的問題。
這次電話有什么問題?
int params[2] = {1, 1};
return strcmp95((char*)buffer1, (char*)buffer2, (long)stringLength, ¶ms);
該函數定義如下:
double strcmp95(char *ying, char *yang, long y_length, int *ind_c[])
{...
當我在XCode中編譯時,我收到以下警告:
警告:從不兼容的指針類型傳遞'strcmp95'的參數4
抱歉不精確。 這是功能描述:
/ *參數:ying和yang是指向要比較的2個字符串的指針。 字符串不必是NUL終止的字符串,因為傳遞了長度。 y_length是字符串的長度。 ind_c是一個數組,用於定義是否應激活某些選項。 非零值表示該選項已停用。
選項包括:ind_c [0]當匹配的字符數很大時,增加匹配的概率。 當字符串很大時,此選項允許更多的容差。 在比較固定長度字段(如電話號碼和社會保險號碼)時,這不是一個合適的測試。 ind_c [1]在比較之前,所有小寫字符都轉換為大寫。 禁用此功能意味着更低
大小寫字符串“code”將不會被識別為與大寫字符串“CODE”相同。 此外,類似字符部分的調整僅適用於大寫字符。 建議的值對於字符串(例如名稱)都是零。 * /
params
是一個int [2]
,它在傳遞給函數時衰減為int *
,並且將int []
s作為參數的函數實際上在后台采用int *
s。 不幸的是, ¶ms
是一個int(*)[2]
,它比你需要的int **
(與函數參數中的int *[]
相同)更接近int *
。
您最好的選擇是將您的功能更改為:
double strcmp95(char *ying, char *yang, long y_length, int *ind_c)
並假設調用者將始終傳遞int[2]
。 或者你可以明確地要求一個int(*)[2]
- 一個指向2個int
數組的指針:
double strcmp95(char *ying, char *yang, long y_length, int (*ind_c)[2])
但這似乎沒有必要保證傳遞兩個int
,如果你需要考慮數組中兩個以上int
的可能性是不合適的。 更好的方法是:
double strcmp95(char *ying, char *yang, long y_length, int *ind_c, size_t len)
size_t
是一個無符號整數類型,保證能夠保存任何對象或任何數組索引的大小,在這種情況下, len
參數是數組的長度( (sizeof params / sizeof params[0])
如果你想是花哨的/前瞻性思維, 2
如果你不這樣做。 那是最安全的路線。
順便說一下,你的y_length
參數也應該是size_t
變量。 long
簽名了,我不想處理一個-1長度的字符串。 即使你使用unsigned long
,也不能保證long
足以處理系統的大小(或者相反,一個錯誤的大long
值對於你的系統來說太大而無法處理並導致混淆)。
strcmp95
獲取一個指向int( int **
)的指針,同時向它傳遞一個指向兩個int數組的指針( int (*)[2]
)。
您可以修改strcmp95
,使其簽名如下所示:
double strcmp95(char *ying, char *yang, long y_length, int (*ind_c)[] );
這里的要點是指向數組的指針( int (*x)[]
)與指針數組( int *(x[])
,與int *x[]
)
很難知道strcmp95是否應該采用像你試圖傳遞的int數組,或者它是為了獲取原型請求的int指針數組。 前者似乎很可能 - 如果是這樣,你應該改變......
double strcmp95(char *ying, char *yang, long y_length, int *ind_c[])
...至...
double strcmp95(char *ying, char *yang, long y_length, int *ind_c)
......或者,等同地......
double strcmp95(char *ying, char *yang, long y_length, int ind_c[])
為什么你傳遞和params,params就足夠了,因為數組就像一個指針。
return strcmp95((char*)buffer1, (char*)buffer2, (long)stringLength, params);
其次strcmp95現在應該期待一系列的整數,這很好:
double strcmp95(char *ying, char *yang, long y_length, int ind_c[])
另外我認為你傳遞的是params(它本身就是一個整數指針),而strncmp95函數期望指向整數數組的指針,即int * ind_c []。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.