簡體   English   中英

沒有使用strlen時strlen的分段錯誤?

[英]Segmentation fault with strlen when not ever using strlen?

我有一些代碼,它接受一個文件,將每一行讀入一個新的字符串數組(並為每個字符添加128),然后將每個數組分配到一個指針數組,然后打印每個數組。 嘗試運行代碼時,由於以下原因,我收到錯誤,指出了分段錯誤:

strlen () at ../sysdeps/x86_64/strlen.S:106 106 ../sysdeps/x86_64/strlen.S: No such file or directory.

但我從來沒有在我的代碼中調用strlen?

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#define ROW 10
#define COL 40
#define ARGS 2
#define FLIP_VALUE 128

char** read_file (char* argv[], char **array_pointers);
char* new_array (void);
void print_strings (char** array_pointers);

int main(int argc, char* argv[])
{
    char **array_pointers = NULL;
    if (argc == ARGS)
    {
        array_pointers = read_file(&argv[1], array_pointers);
        print_strings(array_pointers);
    }
return 0;
}

char** read_file (char* argv[], char **array_pointers)
{
    FILE* file_name;
    int i = 0, j = 0;
    char c;
    char *temp_array;
    array_pointers = malloc(sizeof(char*) * ROW);
    file_name = fopen(argv[0], "r"); 
    assert(file_name);
    if (file_name) /* if file is not null */
    {
        while (c != EOF) /* while not equal to end of file */
        {
            for (j = 0; j < ROW; j++) /* for each row */
            {
            temp_array = new_array(); /* generate a new array for each new string (row) */
                for (i = 0; i < COL; i++) /* for each char in a row */
                {
                    c = fgetc(file_name);
                    temp_array[i] = c + FLIP_VALUE;
                }
            array_pointers[j] = temp_array; /*assign array pointers to point at each new temp_array */
            }   
        }
    }
    return array_pointers;
}

char* new_array (void)
{
    char* temp;
    temp = malloc(sizeof(char) * COL);
    assert(temp);
    return temp;    
}           

void print_strings (char** array_pointers)
{
    int i = 0;
    for (i = 0; i < COL; i++)
    {
        printf("%s\n",array_pointers[i]);
    }
}

完整堆棧跟蹤讀作:

#1  0x00007ffff7a84e3c in _IO_puts (str=0x0) at ioputs.c:36
        result = -1
        len = <optimised out>
#2  0x0000000000400806 in print_strings (array_pointers=0x602010)
    at array_of_string_arrays.c:65
        i = 10
#3  0x00000000004006a1 in main (argc=2, argv=0x7fffffffdff8)
    at array_of_string_arrays.c:19
        array_pointers = 0x602010

print_strings您使用printf("%s", str);打印字符串printf("%s", str); 這要求字符串為空終止。 如果您正在讀取普通文本文件,則您寫入的字符串不會以空值終止。 您需要將終止空字節添加到您讀取的字符串 - 或者您不能使用printf

你遇到崩潰的原因是你的printf似乎首先檢查字符串的長度(使用strlen )然后再打印出來。 strlen遞增char指針,直到它讀取空字節。 由於字符串中沒有任何內容,因此strlen讀取緩沖區並最終在內存中的某處讀取空字節,或者如果不允許讀取該內存則崩潰。

實際上有幾個錯誤:

  1. read_filec首先在與EOF進行比較時未定義。 你甚至需要這個外環嗎?

  2. 你應該在它返回時檢查fgetc的結果,看它是否是EOF

  3. 您為每行的每個字符分配一個新的temp_array ,而不是為每一行分配一次。 這需要向上移動到包含循環中。

  4. print_strings ,您正在遍歷行,因此您應該將循環索引與ROW進行比較,而不是COL

  5. 打印行時,您在printf中使用%s 你不能這樣做,因為不能保證連續的字符是以空值終止的。 您可以強制它們,通過分配一個額外的字符並在其中存儲'\\0' ,或者您可以在格式說明符中包含一個長度字段來限制長度(您可以使用*將其作為參數傳遞)。

我懷疑最后一個錯誤是導致分段錯誤的錯誤。

temp = malloc(sizeof(char) * COL); 

你應該

memset(temp,0,sizeof(char) * COL);

因為strlen0讀取結束。

暫無
暫無

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

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