打印char缓冲区时出现问题

时间:2017-07-07 17:46:49

标签: c

我想将文件名路径存储在char变量中,稍后通过函数调用传递它。为此,我声明了以下char缓冲区:

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

现在,为了测试它,我使用路径分配它,然后打印缓冲区的值以确保它适合。

filename_path= "../Datasets/Cluster(%d)%s";
printf("%s\n", filename_path);
...
free(filename_path);

然而,我收到此错误:

../Datasets/Cluster(%d)%s
k.out(1154,0x7fff9843c3c0) malloc: *** error for object 0x103fbbacb: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

有人可以提示我问题的原因吗?谢谢

5 个答案:

答案 0 :(得分:2)

该行

filename_path= "../Datasets/Cluster(%d)%s";

不会将字符串文字的内容复制到filename_path指向的内存中;它用字符串文字的地址覆盖 filename_path的值。你基本上丢弃了malloc返回的值,导致a)内存泄漏,b)调用free时出错。

使用strcpy函数:

,而不是使用赋值运算符
strcpy( filename_path, "../Datasets/Cluster(%d)%s" );

答案 1 :(得分:1)

您的代码使用新的常量字符串(filename_path = "../Datasets/Cluster(%d)%s"行)覆盖malloc返回的指针。然后,它试图释放它。

你不能这样做,因为指针与malloc返回的指针不再相同。

要将内容复制到malloc的字符串中,您应该使用strncpy

像这样:

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

strncpy(filename_path, "../Datasets/Cluster(%d)%s", 100);
printf("%s\n", filename_path);

free(filename_path);

答案 2 :(得分:0)

问题是您需要保存原始指针才能释放它:

因此,存储一个临时指针并将其释放。

char *filename_path ,*temp_path; 
filename_path  =  malloc(100* sizeof(char));
temp_path = filename_path;

//your code for filename_path

free(temp_path);

答案 3 :(得分:0)

这样看:

  1. 您正在分配100个字节的内存,并指定filename_path指针指向分配的内存。

  2. 您现在更改 filename_path指向静态字符串“../Datasets/Cluster(%d)%s”。

  3. 由于您更改了filename_path所指向的位置,因此您不再拥有指向您之前分配的内存的指针,并且无法再将其释放。

  4. 当你试图释放filename_path时,你实际上是在尝试释放静态字符串“../Datasets/Cluster(%d)%s”,当然正如错误消息所说,不是实际上是由malloc分配的。

答案 4 :(得分:0)

问题是malloc()的内存位置与filename_path= "../Datasets/Cluster(%d)%s";

等字符串文字的对比

malloc()上分配内存并返回指向该内存的指针。字符串文字完全位于其他地方 - 通常是静态/数据(有关详细信息,请参阅此帖子where in memory are string literals ? stack / heap?

由于您已指定filename_path指向除了您使用malloced之外的其他位置,因此您无法释放它。