簡體   English   中英

在 C 中用指針打印數組

[英]Print array with pointer in C

我有一個指向char數組的指針,我需要打印整個數組(不是一個接一個,而是整個數組)。 我有錯誤: zsh: segmentation fault 我不明白為什么。 我的代碼從stdin獲取文本並將字符放入數組中。 如果第一個數組char_array不夠大,我會將它們放在名為bigger_array的第二個bigger_array

int main() {
    int c;
    int index = 0;
    size_t size = 100;                        
    char *char_array = malloc(size * sizeof(char)); 
    if (char_array != 0) {
        while ((c = getchar()) != EOF && index < size) {
            char_array[index] = c;
            index++;
        }
        size_t newSize = size * 100;
        char *bigger_array = realloc(char_array, newSize * sizeof(char)); 
        if (bigger_array != 0) {
            bigger_array = char_array;
            while ((c = getchar()) != EOF && index < newSize) {
                bigger_array[index] = c;
                index++;
            }
            size = newSize;
        }
    }
    printf(*char_array);
    return 0;
}
  • bigger_array = char_array; 應該是char_array = bigger_array; . 否則,指向新分配緩沖區的指針將被覆蓋到指向舊緩沖區的指針,並且會發生不好的事情。
  • printf(*char_array); 不好,因為它在需要指針的地方傳遞一個整數(一個字符)。 它應該是printf("%.*s", index, char_array); . 請注意,指定了要打印的長度,因此您無需添加終止空字符。

您的代碼中有多個問題:

  • 你不包括<stdio.h><stdlib.h>
  • 您應該釋放char_array並將big_array存儲到char_array以便char_array指向更大的分配數組。
  • printf(*char_array)由於多種原因具有未定義的行為。 您可以使用fwrite(char_array, 1, index, stdout)printf("%.*s\\n", (int)index, char_array)
  • 不需要單獨的循環,只需根據需要重新分配數組。

這是一個修改后的版本:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int c;
    size_t index = 0;
    size_t size = 100;
    char *char_array = malloc(size);
    if (char_array != NULL) {
        while ((c = getchar()) != EOF) {
            if (index == size) {
                size_t new_size = size + size / 2 + size / 8; /* increase by the golden ratio */
                char *new_array = realloc(char_array, new_size);
                if (new_array == NULL) {
                    fprintf(stderr, "out of memory\n");
                    free(char_array);
                    return 1;
                }
                size = new_size;
                char_array = new_array;
            }
            char_array[index++] = c;
        }
        printf("%.*s\n", (int)index, char_array);
    }
    return 0;
}

將此視為評論^^

我建議你使用標志來警告你的編譯器。 例如gcc標志-W -Wextra -Wshadow很好用,可以防止浪費時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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