当前位置:  开发笔记 > 编程语言 > 正文

没有使用strlen时strlen的分段错误?

如何解决《没有使用strlen时strlen的分段错误?》经验,为你挑选了1个好方法。

我有一些代码,它接受一个文件,将每一行读入一个新的字符串数组(并为每个字符添加128),然后将每个数组分配到一个指针数组,然后打印每个数组.尝试运行代码时,由于以下原因,我收到错误,指出了分段错误:

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

但我从来没有在我的代码中调用strlen?

#include 
#include 
#include 
#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 = 
#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

Werner Henze.. 5

print_strings你打印字符串使用printf("%s", str);.这要求字符串为空终止.如果您正在读取普通文本文件,则您写入的字符串不会以空值终止.您需要将终止空字节添加到您读取的字符串中 - 或者您无法使用printf.

你遇到崩溃的原因是你printf似乎首先要检查字符串strlen在打印之前有多长(使用).strlen递增char指针,直到它读取空字节.由于字符串中没有任何内容,因此strlen读取缓冲区后最后会在内存中的某处读取空字节,或者如果不允许读取该内存则会崩溃.



1> Werner Henze..:

print_strings你打印字符串使用printf("%s", str);.这要求字符串为空终止.如果您正在读取普通文本文件,则您写入的字符串不会以空值终止.您需要将终止空字节添加到您读取的字符串中 - 或者您无法使用printf.

你遇到崩溃的原因是你printf似乎首先要检查字符串strlen在打印之前有多长(使用).strlen递增char指针,直到它读取空字节.由于字符串中没有任何内容,因此strlen读取缓冲区后最后会在内存中的某处读取空字节,或者如果不允许读取该内存则会崩溃.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有