strcpy() error: Bad permissions for mapped region at address
strcpy() error: Bad permissions for mapped region at address
我对 K&R 的练习 5-13 有疑问,练习的目标是制作一个与 *nix 命令功能相同的函数 tail,这是我的函数:
#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] = "[=10=]";
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] = "[=10=]";
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]="[=12=]";
没有帮助...知道是什么原因造成的吗?提前致谢!
编辑:已启动 --> 已初始化
我相信你还有很多问题,但肯定有一个问题:
int tail(int n)
{
char *saved_lines[n];
for(int i=0;i<n;i++)
saved_lines[i]="[=10=]";
您正在声明一个(可变长度)指针数组。然后让这个指针指向数据段中某处的固定字符串。然后你去尝试修改那个记忆。不,不。
您需要为每一行保留内存。你可以选择类似的东西:
for(int i = 0; i < n; i++)
saved_lines[i] = calloc(MAXLINE, 1);
但是从这里开始还有很多工作要做。另外,您稍后需要释放该内存。
我对 K&R 的练习 5-13 有疑问,练习的目标是制作一个与 *nix 命令功能相同的函数 tail,这是我的函数:
#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] = "[=10=]";
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] = "[=10=]";
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]="[=12=]";
没有帮助...知道是什么原因造成的吗?提前致谢!
编辑:已启动 --> 已初始化
我相信你还有很多问题,但肯定有一个问题:
int tail(int n)
{
char *saved_lines[n];
for(int i=0;i<n;i++)
saved_lines[i]="[=10=]";
您正在声明一个(可变长度)指针数组。然后让这个指针指向数据段中某处的固定字符串。然后你去尝试修改那个记忆。不,不。
您需要为每一行保留内存。你可以选择类似的东西:
for(int i = 0; i < n; i++)
saved_lines[i] = calloc(MAXLINE, 1);
但是从这里开始还有很多工作要做。另外,您稍后需要释放该内存。