【问题标题】:strcpy() error: Bad permissions for mapped region at addressstrcpy() 错误:地址映射区域的权限错误
【发布时间】:2017-10-07 12:10:16
【问题描述】:

我对 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

...我不明白为什么,起初 strcpy 遇到了 saved_lines[i] 指针未初始化的问题,用

解决了这个问题
for(int i=0;i<n;i++)
    saved_lines[i]="\0";

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


编辑:已启动 --> 已初始化

【问题讨论】:

  • 指针都被初始化为指向一个字符串字面量。您需要一些实际的存储空间。
  • OT: "已启动" ---> "已初始化"
  • 为 char 数组中的每个单词分配一些内存,它们指向字符串文字。 char 文字作为二进制文件的一部分存储为read-only。你应该知道strcpy 修改了它的参数。这将对您有所帮助,About string literalsSimilarQuestion

标签: c strcpy


【解决方案1】:

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

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);

但从这里开始,还有很多事情要做。另外,您稍后需要释放该内存。

【讨论】:

  • 我想在未初始化的saved_lines[i] 上使用strcpy 是不可能的?
  • 正如@alk 指出的“未初始化”应该是“未初始化”,意思是“未初始化”,意思是“它们指向随机的东西”,或者在你的情况下“它们指向内存中的相同字符串”。所以不,你不能strcpy 到内存中的随机位置。首先分配内存,然后使用它。这是C的丑陋之处。哦,然后释放它。我也忘了在 cmets 做这件事……
  • OT: “” --> “具有挑战性”! ;-)
  • @CostantinoGrana 你说有很多问题,你能澄清一下这些是什么吗?我修改了我的代码为saved_lines[i]分配内存并在我的程序结束时释放它,但我仍然有一个Segmentation fault (core dumped)strcpy...
  • @Ryuuzaki_kun 你有没有试过删除毫无意义的saved_lines[n - 1] = "\0";
猜你喜欢
  • 2020-12-25
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2011-12-18
相关资源
最近更新 更多