我如何将一个字符串保存为指针并使用malloc重新定义它?C

问题描述 投票:0回答:1

我在一个循环中,我想把从fifo中读取的值保存在一个变量中。

    char *tmp=NULL;
    char *opts=NULL;
    char break_[]="DONE\n";
    int byte_;
    while(1){
        pipe_r = open(pipe_r_n, O_RDONLY);
        if(pipe_r==-1){
            exit(100);
        }
        read(pipe_r,&byte,sizeof(int));
        opts=malloc((byte+1)*sizeof(char));
        if (!opts) {
            free(opts);
            opts = NULL;
            close(pipe_r);
            exit(102);
        }
        read(pipe_r,opts,byte*sizeof(char));
        printf("ho letto: %s",opts);
        close(pipe_r);
        if(strcmp(opts,break_)==0){
            break;
        }
        free(opts);opts=NULL;tmp=NULL;
    }
    free(opts);opts=NULL;tmp=NULL;

byte_ int是后面需要读取的字节数。它在开始的时候说读取了0个字节,但也打印(read not waiting(?)).然后它用正确的字节数读取一行,之后什么都不读,但用同样的字节数......有时它自己重读而不是什么都不读......这就是客户端。

    fd=fopen(argv[3],"r"); 
    if(fd==NULL){
        exit(100);
    }
    char *line=NULL;
    size_t len=0;
    ssize_t read;
    int byte;

    while ((read = getline(&line, &len, fd)) != -1) {
        printf("%s\n",line);
        pipe_r = open(pipe_r_n, O_WRONLY);
        if(pipe_r==-1){
            exit(100);
        }
        byte=strlen(line);
        byte;
        write(pipe_r,&byte,sizeof(int));
        write(pipe_r,line,sizeof(char)*(strlen(line)));
        close(pipe_r);
        if(strcmp(line,"EXIT\n")==0){
            break;
        }
   }
c string pointers memory realloc
1个回答
4
投票

正如@Michael Dorgan所指出的,你需要在其中加入 opts[byte] = '\0' 读取字符串后,你的malloced区域的最后一个字节总是未初始化的(可能是任何剩余的值)。

你malloced区域的最后一个字节总是未初始化的(可能是任何剩余值)。而且由于你有频繁的malloc和free行为。很可能你的堆内存中喷出了非零字符。因此,当你调用 printf,你从之前的循环运行中泄露了字符串。

© www.soinside.com 2019 - 2024. All rights reserved.