我在c代码中尝试一个简单的事情:
const char *files[4];
char buffer[50];
int i;
for(i = 0; i < 5; i++){
sprintf(buffer,"test%i%s", i, ".txt");
files[i] = buffer;
}
文件输出:
test4.txt
test4.txt
test4.txt
test4.txt
test4.txt
我真正想要实现的目标:
test0.txt
test1.txt
test2.txt
test3.txt
test4.txt
任何人都可以告诉我什么是错的吗? (文件必须是const char *)
答案 0 :(得分:4)
变量buffer
在整个程序执行过程中具有相同的地址。
因此,files[0]
,files[1]
,files[2]
和files[3]
都会指向同一地址。
在循环的最后一次迭代中,您尝试设置files[4]
,这会产生未定义的行为。
对于您想要实现的目标,您可以执行以下操作:
int i;
char files[5][50];
for (i=0; i<5; i++)
sprintf(files[i],"test%d.txt",i);
答案 1 :(得分:2)
您正在将所有字符串复制到同一缓冲区中,因此最终所有files
元素都指向同一个字符串。使用strdup
,malloc
或固定字符串缓冲区将名称存储在。
答案 2 :(得分:2)
尝试以下
char files[5][10];
int i;
for ( i = 0; i < 5; i++ )
{
sprintf( files[i], "test%i%s", i, ".txt" );
}
至于你的代码然后有一个内存溢出,因为你将数组文件定义为有4个元素但使用了5个元素。而且你总是将相同的变量缓冲区地址分配给数组的元素。