strcpy()错误:地址映射区域的权限错误

时间:2017-10-07 12:10:16

标签: c strcpy

我对K& R的练习5-13有问题,练习的目标是制作一个与* nix命令相同的函数尾部,这里是我的函数:

#include <stdio.h>
#include <string.h>
#include "tail.h"

int tail(int n)
{
    char *saved_lines[n];
    for (int i = 0; i < n; i++)
        saved_lines[i] = "\0";
    int line_state[n];
    for (int j = 0; j < n; j++)
        line_state[j] = 0;
    int num_lines = 0, i = 0;
    char line[MAXLINE];
    saved_lines[n - 1] = "\0";
    while (get_line(line, MAXLINE) > 0)
    {
        for (i = 0; i < n - 1; i++)
        {
            strcpy(saved_lines[i], saved_lines[i + 1]);
            line_state[i] = line_state[i + 1];
        }
        strcpy(saved_lines[n - 1], line);
        line_state[n - 1] = 1;
    }
    printf("last %d lines: \n", n);
    for (i = 0; i < n; i++)
        if (line_state[i] == 1)
            printf("%d: %s\n", i, saved_lines[i]);
}

问题是当我运行它时出现Segmentation fault (core dumped)错误,并通过Valgrind运行它显示错误来自对strcpy的调用:

==25284== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==25284==  Bad permissions for mapped region at address 0x108E64

...我不明白为什么,首先strcpysaved_lines[i]指针未初始化的问题,用

修复它
for(int i=0;i<n;i++)
    saved_lines[i]="\0";

没有帮助......任何可能导致这种情况的想法?提前谢谢!

编辑:已启动 - &gt;初始化

1 个答案:

答案 0 :(得分:3)

我相信你还有很多问题,但肯定有一个问题:

int tail(int n)
{
  char *saved_lines[n];
  for(int i=0;i<n;i++)
    saved_lines[i]="\0";

您正在声明一个(可变长度)指针数组。然后,使此指针指向数据段中某处的固定字符串。然后你去尝试修改那个记忆。不,不。

您需要为每个线路保留内存。你可以去寻找类似的东西:

  for(int i = 0; i < n; i++)
    saved_lines[i] = calloc(MAXLINE, 1);

但是从这里开始还有很多工作要做。此外,您需要在以后释放该内存。