如何调试这个c代码

时间:2017-03-21 18:36:16

标签: c string pointers char free

观看视频 - https://youtu.be/kXXpj1ruE0o

好的,我正在编写这个程序,它打印最后n行输入。 n是命令行参数,默认值为10.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char line[500];
int pos = 0;

void copy(char* tailed[], int n){

    if(pos == n){

        // moving contents of array to one position back

        for(int i=0; i<pos-1; i++)
            tailed[i] = tailed[i+1];
        //free(tailed[pos-1]); not working
        pos--;
    }
    tailed[pos++] = strcpy(malloc(strlen(line) * sizeof(char)), line);
}

int main(int argc, char* argv[]){

    if(argc > 2){
        printf("[*]Error");
        return 0;
    }

    int n = argc==2 ? atoi(argv[1]) : 10, c;
    char* tailed[n];

    while(scanf("%[^\n]%*c", line) != EOF){
        copy(tailed, n);            
    }

    for(int i=0; i<pos; i++)
        printf("%s\n", tailed[i]);
}

此代码工作正常并打印最后n行。但是当我使用免费(尾[pos-1])时,程序会给出错误的答案。

代码说明..

scanf()接受输入并存储在字符数组行中。如果pos小于n,则将该行复制到malloc创建的新内存中,并将指针存储在tailed数组中。

如果pos变量大于n,则将数组的内容移回一个位置,并使用free()清除最后一个元素。

如果我不使用free(),程序会提供正确的输出,但在使用时不会。

2 个答案:

答案 0 :(得分:2)

至少你可能会通过创建一个太短的缓冲区来调用 undefined behavior 来接受随后写入的缓冲区。

该行:

tailed[pos++] = strcpy(malloc(strlen(line) * sizeof(char)), line);

除非是非常规的,将目标缓冲区缩短为1,应该是:

tailed[pos++] = strcpy(malloc(strlen(line) * sizeof(char))+1, line);
                                                          ^^

strlen(...)返回当前占用缓冲区的字符数,但不包含\ 0字符。如果要为新缓冲区分配内存,则需要足够大以包含相同大小的字符串,那么您需要在malloc语句中包含+1 to size以允许NULL终止。总是

举例来说,当我在我的系统上运行原始代码时,我得到了这个运行时指示:

enter image description here

添加+1后,它会正常运行,不会出现任何运行时错误。

顺便说一句,在Google中输入 list of good C debuggers 会产生相当不错的效果... enter image description here

答案 1 :(得分:-1)

我正在清除错误的字符串。 free(tailed [0])正在运行。