簡體   English   中英

將指向int數組的指針傳遞給c函數

[英]Passing a pointer to an int array to a c-function

我有一個非常基本的問題。

這次電話有什么問題?

int params[2] = {1, 1};
return strcmp95((char*)buffer1, (char*)buffer2, (long)stringLength, &params);

該函數定義如下:

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。 不幸的是, &params是一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM