观看视频 - 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(),程序会提供正确的输出,但在使用时不会。
答案 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终止。总是
举例来说,当我在我的系统上运行原始代码时,我得到了这个运行时指示:
添加+1
后,它会正常运行,不会出现任何运行时错误。
顺便说一句,在Google中输入 list of good C debuggers 会产生相当不错的效果...
答案 1 :(得分:-1)
我正在清除错误的字符串。 free(tailed [0])正在运行。