【发布时间】:2014-10-04 05:53:00
【问题描述】:
谁能解释一下为什么这不起作用?看来程序停在 sprintf(t->tuple[0], "abc");我不知道为什么。真的需要帮助。
int testRemoveMeio(){
int result, i;
struct list_t *list = list_create();
char *tdata[3] = {" ", "2014", "Fixe!"};
struct tuple_t *t = tuple_create2(3, tdata);
struct tuple_t *tdups[4];
struct entry_t *entries[4];
sprintf(t->tuple[0], "abc");
tdups[0] = tuple_dup(t);
entries[0] = entry_create(tdups[0]);
list_add(list, entries[0]);
//extra code similar to above
return 0;
}
编辑:
struct tuple_t {
int tuple_dimension;
char **tuple;
};
struct tuple_t *tuple_create2(int tuple_dim, char **tuple){
struct tuple_t *t = (struct tuple_t *) malloc(sizeof(struct tuple_t));
if(t == NULL)
return NULL;
t->tuple_dimension = tuple_dim;
t->tuple = tuple;
return t;
}
编辑添加来自 cmets 的另一个示例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char * s = "ABC";
printf("%s\n",s);
sprintf(s,"DEF");
printf("%s\n",s);
return 0;
}
【问题讨论】:
-
你没有给我们完整的工作代码,但无论如何你应该能够使用调试器来查明崩溃的位置,或者是否真的发生了崩溃(你说你的程序“停止”但这不是很精确)。
-
[回复 OP 的评论,后来被删除....] 我无法解释,因为我不是通灵者,但调试器可以在您的实际代码上运行并准确告诉您崩溃是。试一试,如果你仍然无法理解它,请回来。然后,我们至少需要查看
tuple_create2()的定义。 -
我明白了。我可能应该给你完整的代码,但它太多了。相反,你能解释一下这个简单的事情以及为什么它不起作用吗? #include
#include int main(void){ char * s = "ABC"; printf("%s\n",s); sprintf(s,"DEF"); printf("%s\n",s);返回0; } -
永远不要在 2014 年使用
sprintf。在char的一些 数组 或一些堆分配的char区域上使用 snprintf(3)。或者如果你的系统有asprintf(3)。 -
这可以工作。实际上它不是因为
s是用"ABC"初始化的,这是一个常量字符串。通常,编译器将常量字符串分配到内存的只读段中。所以s = "ABC"用内存只读部分的地址初始化s。因此,当您尝试将某些内容复制到s(使用sprintf(s,"DEF")或更好的strcpy(s, "DEF"))时,会发生错误,因为您尝试编写只读部分..