Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何调试这个c代码_C_String_Pointers_Char_Free - Fatal编程技术网

如何调试这个c代码

如何调试这个c代码,c,string,pointers,char,free,C,String,Pointers,Char,Free,见视频- 好的,我正在写这个程序,它打印最后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 pos

见视频-

好的,我正在写这个程序,它打印最后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]);
}
#包括
#包括
#包括
字符行[500];
int pos=0;
无效副本(字符*尾部[],整数n){
如果(pos==n){
//将数组内容移回一个位置
对于(int i=0;i 2){
printf(“[*]错误”);
返回0;
}
int n=argc==2?原子(argv[1]):10,c;
字符*尾[n];
而(扫描频率(“%[^\n]%*c”,第行)!=EOF){
副本(带尾,n);
}

对于(inti=0;i,您至少可以通过创建一个太短的缓冲区来进行调用,以接受随后写入的内容

该行:

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以允许空终止。始终

作为说明,当我在我的系统上运行您的原始代码时,我得到以下运行时指示:

一旦我添加了
+1
,它就会正常工作,没有任何运行时错误


顺便说一句,在Google中输入结果非常好…

我清除了错误的字符串。free(tailed[0])正在工作。

简单的回答是告诉您查看调试器并手动执行代码。这是一项非常有用的技能,您应该尝试一下。我注意到一件小事:您声明了一个int,
c
,然后再也不使用它。您似乎在自动分配它之前释放了一些内容…这可能是您的问题?在复制函数中,您可以可能在malloc之前使用free。
strlen(…)
返回当前占用缓冲区的字符数,但不包括
\0
字符。如果要为新缓冲区分配内存,该缓冲区需要足够大以包含相同大小的字符串,则需要在malloc语句中包含
+1
以调整大小,以允许空终止。始终如此。@ryker谢谢你,你也是对的。但是我清除了错误的字符串,这就是为什么我得到了错误的输出。