![](/img/trans.png)
[英]How do I sum each row of a 2D Array using pointers and what is wrong with my code?
[英]How to return an array of char pointers? What is wrong in my code?
我看過與我的問題相關的類似帖子,但我找不到任何答案來理解此代碼中的錯誤。
因此,我有一個無法更改返回類型的函數(對於案例 1)。 對於情況 2,我想知道如何返回char *a[]
;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **myfunc(int n) {
char **a = malloc(n * sizeof(char *));
int i, j = 1;
for (i = 0; i < n; i++)
a[i] = malloc(9 * sizeof(char));
for (i = 0; i < n; i++) {
snprintf(a[i], 5, "%d", i);
return a;
}
int main() {
int num = 10, i;
char **ar = myfunc(num);
for (i = 0; i < num; i++)
printf("%s\n", ar[i]);
return 0;
}
1) 在myfunc()
,我應該如何正確返回a
? 我的編譯器向我拋出從不兼容的指針類型返回的警告。
2) 如果我將上面的myfunc()
更改如下,我應該如何返回修改后的緩沖區?
char ???myfunc(int n) {
char *a[n];
for (i = 0; i < n; i++)
a[i] = malloc(10 * sizeof(char));
return ?
}
3) 在這兩種情況下,我應該如何處理main()
函數內部的返回?
案例2:
char *myfunc(int n) {
static char *a[n];
int i;
for (i = 0; i < n; i++)
a[i] = malloc(9 * sizeof(char));
for (i = 0; i < n; i++)
snprintf(a[i], 5, "%d", i);
return a;
}
int main() {
int num = 10, i;
char *ar = myfunc(num);
for (i = 0; i < num; i++)
printf("%s\n", ar[i]);
return 0;
}
您的代碼縮進錯誤,這使得它難以閱讀並隱藏了愚蠢的錯誤,例如第二個for
之后的額外大括號。
一旦糾正了這個錯誤,代碼就可以編譯並運行良好:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **myfunc(int n) {
char **a = malloc(n * sizeof(char *));
int i;
for (i = 0; i < n; i++)
a[i] = malloc(9 * sizeof(char));
for (i = 0; i < n; i++)
snprintf(a[i], 9, "%d", i);
return a;
}
int main() {
int num = 10, i;
char **ar = myfunc(num);
for (i = 0; i < num; i++)
printf("%s\n", ar[i]);
return 0;
}
如果您更改myfunc()
以將a
定義為char *a[n];
,當從myfunc()
返回a
時會遇到一個主要問題,因為該數組僅在myfunc()
的范圍內定義。 返回它的地址,簡單地return a;
將導致main()
未定義行為,因為它指向的空間可能已被其他東西重用,例如printf()
局部變量。
第三個選項,您將a
定義為static char *a[n];
不編譯,因為在編譯時必須知道靜態對象的大小。 不建議使用本地static
對象,因為它使程序更難理解和不可重入,具有隱藏的內部狀態等。其中一個函數是<string.h>
strtok()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.