2014-03-26 56 views
0

抱歉我的英语不好。我是Linux系统编程的新手,也是C编程的新手。
目前我试图取消链接文件,要做到这一点,我必须在某处存储文件路径。我为每个文件使用1024个元素的字符数组。如果我减小数组的大小,文件描述符变得混乱。听起来很愚蠢,但确实如此。
下面是一些代码:
奇怪的行为与数组在C

char path[1024], path2[1024]; 
const char *file_name = "myfile_1", *file_name2 = "myfile_2",*working_directory="/home/Alexander/lab01/"; 
strcpy(path, working_directory); 
strcat(path, file_name); 
strcpy(path2, working_directory); 
strcat(path2, file_name); 

然后我打开某些文件,读\写等。如果路径& PATH2长1024个字节,一切顺利的话.. all_ok
但是当我减少路径& PATH2大小为512或256,有些奇怪的事情发生的内存和其他文件描述符...
all_crap
我可以不明白发生了什么,请帮忙。

代码,在那里我读文件:

fdesc_input = open("/dev/urandom",O_RDONLY); 
if (fdesc_input < 0) { 
    perror("Error opening /dev/urandom: "); 
} 
fdesc_output = open(path, O_RDWR|O_CREAT|O_TRUNC, 0777); 
if (fdesc_output < 0) { 
     perror("Error opening my file: "); 
    } 
buffer = (unsigned char*) malloc(buffer_size); // make 1kb buffer 

desired_filesize = 1024*10; // 10 kilobytes 

int curr_size = 0; 
while (curr_size < desired_filesize) { 

      //AFTER NEXT LINE STRANGE HAPPENS 
    ssize_t result = read(fdesc_input, &buffer, buffer_size); 
    if (result < 0) { 
     perror ("Error reading /dev/urandom: "); 
     exit(1); 
    } 
    curr_size += result; 
    write(fdesc_output, &buffer, buffer_size); 
} 
+0

你显示的东西看起来不错;我怀疑其中的一些“读/写等...”代码(特别是读)可能涉及到。你能向我们展示读物吗? –

+0

我修改了我的问题 – Groosha

+2

'read(fdesc_input,&buffer,buffer_size);'**是一个bug **。与'write'类似,这里不需要'&'。你也可以选择删除'malloc',并使用一个固定大小的缓冲区,比如'char buffer [buffer_size]'(确保'buffer_size'是一个编译时常量)。 –

回答

3

你传入&bufferread,但buffer本身就是一个指针。您传递buffer这是一个局部变量的地址。因此,read将从本地变量开始的数据读入内存,从而覆盖其他局部变量。

通过buffer而不是&buffer,你应该没问题。

+0

此外,从不用C中的'malloc()'强制返回值。它可能会掩盖错误。 – Deduplicator