填充由malloc()分配的内存的影响

时间:2009-12-12 01:17:39

标签: c malloc

虽然我能够纠正我的程序并使其正常运行,但它之所以不起作用,让我感到非常好奇。

我用malloc创建了一个字符串并对其进行了初始化...然后我用它做了几个strcat ...然后我声明了一个文件指针......之后我的字符串超过了大约。其余的26个字符将是垃圾......但是如果我先前将指针声明为字符串malloc,它的工作效果很好。我只是无法理解为什么,这里有一些代码,如果有人认为更好看到更多请说:

代码:

char* holder=(char*)malloc(sizeof(char)*100);

for(i=0;i<100;i++)
    *(holder+i)='\0';

strcat(holder,"set xtics (");

//will ignore until the last n lines
for(i=0;i<26-n;i++)
    readline(sfd,line,29);

//will manage the last lines
char n_column[2];
char freq[3]={0};

for(i;i<26;i++)
{
    readline(sfd,line,29);
    sscanf(line+4,"%s",freq);
    write(out,freq,strlen(freq));
    write(out,"\n",1);
    strcat(holder,"'");
    sscanf(line,"%s",temp);
    strcat(holder,temp);        
    strcat(holder,"'");
    sprintf(n_column,"%d",counter); 
    strcat(holder," ");
    strcat(holder,n_column);
    //for the las one which won't have the ,
    if(i==25)
        strcat(holder,")");
    else
        strcat(holder,", ");
    counter++;      

}

//sending to gnuplot using pipe
printf("Before: %s\n",holder);
FILE *pipe = popen("gnuplot -persist","w"); //why can't it be here!!!!
printf("After: %s\n",holder);

输出:

之前:设置xtics('a'0,'b'1,'c'2,'d'3,'e'4,'f'5,'g'6,'j'7,'k '8,'l'9,'m'10,'n'11,'o'12,'p'13,'q'14,'r'15,'u'16,'v'17,'w '18,'x'19,'y'20,'z'21,'h'22,'i'23,'t'24,'s'25)

之后:设置xtics('a'0,'b'1,'c'2,'d'3,'e'4,'f'5,'g'6,'j'7,'k '8,'l'9,'m'10,'n'11,'o'

但如果我改为:

FILE * pipe = popen(“gnuplot -persist”,“w”);

char* holder=(char*)malloc(sizeof(char)*100);
for(i=0;i<100;i++)
    *(holder+i)='\0';

输出很好。

那么为什么声明文件指针有这么大的区别呢?或者是除此之外的东西?

非常感谢你耐心等待。

3 个答案:

答案 0 :(得分:4)

你有一个100字节的缓冲区和208字节的字符串。这100个字节以外的内存不属于你。

答案 1 :(得分:3)

您正在分配100个字符的缓冲区。

您正在尝试复制超过100个字符。

你不应该对你的腐败感到惊讶。

答案 2 :(得分:2)

您可能会尝试使n_column []大于2.您正在覆盖数组的末尾。

sprintf(n_column,"%d",counter);

我不确定这是否是唯一的问题。