2017-10-07 105 views
-1

错误的权限我有练习5-13 K & R的问题,练习的目标是制作一个与* nix命令相同的函数尾部,这里是我的功能:strcpy()错误:映射区域在地址

#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与01有问题个指针被初始化非,固定与

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

没有帮助...任何想法可能导致此?提前致谢!


编辑:开始 - >初始化

+2

指针都被初始化为指向字符串文字。你需要一些实际的存储空间。 –

+2

OT:“*启动*”--->“初始化” – alk

+0

为char数组中的每个单词分配一些内存,它们指向字符串文字。字符文字作为二进制文件的一部分存储在“只读”位置。你应该知道'strcpy'修改了它的参数。这将帮助你,[关于字符串文字](https://stackoverflow.com/questions/2589949/string-literals-where-do-they-go),[SimilarQuestion](https://stackoverflow.com/questions/ 11379412/crash-when-handling-char-initd-with-string-literal-but-with-malloc) – WhiteSword

回答

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

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

+0

我想不可能在未初始化的'saved_lines [i]'上使用'strcpy'? –

+1

正如@alk指出,“未初始化”应该是“未初始化”,意思是“未初始化”,意思是“它们指向随机事物”,或者在你的情况下“它们指向内存中的同一个字符串”。所以不,你不能在存储器中随意放置。首先分配内存,然后使用它。这是C的丑陋的东西,然后释放它。我忘了也在这里的评论... –

+2

OT:“*难看*” - >“具有挑战性”! ;-) – alk