首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当不使用strlen时,分割错误与strlen?

当不使用strlen时,分割错误与strlen?
EN

Stack Overflow用户
提问于 2015-12-18 10:29:19
回答 3查看 3.6K关注 0票数 3

我有一些代码,它接受一个文件,将每一行读入一个新的字符串数组(并将128个字符添加到每个字符中),然后将每个数组分配到一个指针数组中,然后打印每个数组。当试图运行代码时,我会得到一个错误,说明了一个分段错误,原因是:

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

但我从没在代码里打电话给斯特伦?

代码语言:javascript
复制
#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]);
    }
}

整个堆栈跟踪如下:

代码语言:javascript
复制
#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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-18 10:57:18

实际上这里有几个bug:

  1. read_file中,与EOF相比,c最初是未定义的。你还需要这个外圈吗?
  2. fgetc返回时,您应该检查它的结果,看看它是否是EOF
  3. 您正在为每一行的每个字符分配一个新的temp_array,而不是为每一行分配一次。这需要移到包含的循环中。
  4. print_strings中,您在行上进行迭代,因此应该将循环索引与ROW而不是COL进行比较。
  5. 打印一行时,在printf中使用printf。您不能这样做,因为不能保证行中的字符是空终止的。您可以通过分配额外的字符并在其中存储'\0'来强制它们这样做,或者可以在格式说明符中包含一个length字段来限制长度(可以使用*传递它作为参数)。

我怀疑最后一个错误是导致分割错误的错误。

票数 4
EN

Stack Overflow用户

发布于 2015-12-18 10:55:22

print_strings中,可以使用printf("%s", str);打印字符串。这要求终止字符串为null。如果要读取普通文本文件,则写入的字符串不为null。您需要将终止空字节添加到所读取的字符串中,否则不能使用printf

导致崩溃的原因是,您的printf似乎首先检查字符串的长度(使用strlen),然后再打印出来。strlen会增加字符指针,直到读取空字节为止。由于字符串中没有任何字符串,所以strlen通过缓冲区读取,最后读入内存中的空字节,如果不允许读取该内存,则会崩溃。

票数 5
EN

Stack Overflow用户

发布于 2015-12-18 10:53:17

之后

代码语言:javascript
复制
temp = malloc(sizeof(char) * COL); 

你应该

代码语言:javascript
复制
memset(temp,0,sizeof(char) * COL);

因为strlen是以读取0结束的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34353468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档