我正在爲C
中的趣味/練習編寫通用交換函數genericSwap()
。 (讓我們拋開這個問題是否是個好主意。)由於函數內部使用了memcpy()
,我需要處理指針通過的情況,這些指針是NULL
,在所有其他關於通用交換函數的問題中,這個問題似乎被忽略了。下面是我如何做到這一點至今:處理通用交換函數中的NULL指針
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void genericSwap(void *x, void *y, size_t size);
int main(void)
{
int num1;
int num2;
num1 = 1;
num2 = 2;
printf("%d\t%d\n", num1, num2);
genericSwap(&num1, &num2, sizeof(num1));
printf("%d\t%d\n", num1, num2);
exit(EXIT_SUCCESS);
}
void genericSwap(void *x, void *y, size_t size)
{
void *temp;
if (!x || !y) {
fprintf(stderr, "Trying to pass NULL pointer\n");
exit(EXIT_FAILURE);
}
temp = malloc(size);
if(!temp) {
fprintf(stderr, "Memory allocation failed\n");
exit(EXIT_FAILURE);
}
memcpy(temp, x, size);
memcpy(x, y, size);
memcpy(y, temp, size);
free(temp);
}
這與(當然奇怪的)情況下,像genericSwap(NULL, NULL, sizeof(something))
等交易。正如你可以看到的(或者如果你喜歡測試),當NULL
指針被傳遞時,該函數當前殘酷地錯誤輸出。這可能並不總是處理這種情況的首選方式。有時在一個程序中,我可能希望該功能悄悄地將控制返回給在這種情況下爲main()
的呼叫者。我的想法是每個錯誤處理if
-condition使genericSwap()
成爲後使用空return
:
void genericSwap(void *x, void *y, size_t size)
{
void *temp;
if (!x || !y) {
fprintf(stderr, "Trying to pass NULL pointer\n");
return;
}
temp = malloc(size);
if(!temp) {
fprintf(stderr, "Memory allocation failed\n");
return;
}
memcpy(temp, x, size);
memcpy(x, y, size);
memcpy(y, temp, size);
free(temp);
}
我的問題是,如果我列出迄今爲止策略可以認爲是安全的。另外,我想聽聽你對如何改進這些功能的錯誤處理的建議。
看起來更像是http://codereview.stackexchange.com/的問題嗎? – danielfranca
您可以從函數中返回成功值,而不是'void',然後在main中檢查它。然後在頂層處理它。 –
@danielfranca這是有點邊界線。這裏有一個改進錯誤處理的具體目標,我認爲這個問題可能同時適用於SO和CR。 –