簡體   English   中英

如何返回一個字符指針數組? 我的代碼有什么問題?

[英]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.

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