刚刚得到关于c malloc()函数的查询。我正在读取一个文件的x字节数,以获取文件名的长度,如“read(file,&namelen,sizeof(unsigned char));”。
变量namelen是一个类型unsigned char,并作为该类型(1字节)写入文件。现在namelen的长度是file name ie namelen=8如果文件名是'data.txt',加上结尾的额外/0,就可以正常工作了。
现在我有一个记录文件信息的结构,即文件名、文件长度、内容大小等。
struct fileinfo
{
char *name;
...... other variable like size etc
};
struct fileinfo *files;
问:我想让files.name变量变为namelen ie 8的大小,这样我就可以成功地将文件名写入其中,比如'files[I].name=malloc(namelen)'
但是,我不希望它是malloc(size of(namelen)),因为这会使它file.name[1]成为其类型unsigned char的大小。我希望它是存储在变量namelen ie 8 so file.name[8]中的值,这样data.txt就可以从文件中读取8个字节,直接写入file.name[8?
有办法吗?我现在的代码是4而不是8
files[i].name = malloc(namelen);
//strlen(files[i].name) - returns 4
//perhaps something like
malloc(sizeof(&namelen)) but does not work
谢谢你的建议
尝试过建议,但我现在得到一个分段错误,使用:
printf("\nsizeofnamelen=%x\n",namelen); //gives 8 for data.txt
files[i].name = malloc(namelen + 1);
read(file, &files[i].name, namelen);
int len=strlen(files[i].name); printf("\nnamelen=%d",len);
printf("\nname=%s\n",files[i].name);
当我试图用文件[I].name变量打开()文件时,它不会打开,因此数据似乎不会写入read()&files[I].name和strlen()中,这会导致segementation错误,并试图打印文件名
最佳答案
字符串的长度为strlen(name) + 1
字节(因为终止\0
)。
如果namelen = strlen("data.txt")
(即8),则必须分配files[i].name = malloc(namelen + 1)
使用malloc()
分配的任何内存都是未定义的。不能对刚分配的内存执行strlen()
操作-必须先设置已分配的内存
只有在分配内存之后,才能使用内存,即strncpy( files[i].name, "data.txt", namelen + 1 )
,只有这样,才能strlen( files[i].name )
关于c - 时间:2019-04-01标签:c++ malloc问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4625513/