我需要将char *
传递给函数,但此函数确实需要const
?
但是我正在从文件中读取它,它对我来说很有活力:
fseek(fcode, 0, SEEK_END);
i=ftell(fcode);
square_scm = (char*) malloc(i);
//free(square_scm);
fseek(fcode, 0, SEEK_SET);
fread(square_scm, 1, i, fcode);
scheme_load_string(sc, square_scm);
所以square_scm在这里是:
"(display
(string-append "Answer: "
(number->string (square 6.480740698407859)) "\n"))юоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюо"
没有自由:
"(display
(string-append "Answer: "
(number->string (square 6.480740698407859)) "\n"))ННээээ««««««««««««««««ю"
如何使它像char [size],如:
"(display
(string-append "Answer: "
(number->string (square 6.480740698407859)) "\n"))"
答案 0 :(得分:4)
你的free()
是一场灾难;完成后,您只需free()
数据。
您应该错误地检查返回代码,至少是malloc()
和fread()
。
从文件读取的数据不会以空值终止。在将数据读入分配的缓冲区后,需要按一个字节过度分配并添加终端NUL('\0'
)。 (请注意,自打开文件后文件可能已缩小;注意fread()
返回的值。如果文件增长,您将看不到额外数据,但不会发生其他损坏。)
你问const
。据推测,函数square_cm()
具有如下符号:
void square_cm(SomeType *sc, const char *data_string);
你担心你的主叫代码中有char *
而不是const char *
吗?
你不需要担心;编译器将为您“添加const
”。 const
实际上是对函数用户的承诺,函数本身不会修改您的数据。它可以采用固定的字符串(例如字符串常量)或动态分配的字符串,并不重要。遇到问题的地方是你有一个const char *
或一个字符串文字,你需要传递给一个char *
的函数。在这里,函数不会自己承诺单独留下字符串,这可能会导致问题。例如,您不能将字符串文字传递给strtok()
,因为该函数尝试修改字符串,但该字符串可能在只读内存中,这会触发问题(Unix上的核心转储;各处未定义的行为)
因此,函数签名中的const
是对函数的使用者(用户)的承诺,不会改变某些东西。您可以将const
或非const
数据传递给该函数,因为它不会被修改。
答案 1 :(得分:2)
free()
来电。从文件中读取后,您不会终止字符串。你应该null终止该字符串。类似的东西:
square_scm[i] = 0;
确保您已分配足够的空间以允许空终止符 - 这意味着在+1
来电中添加malloc()
。
或者,您可以为printf()
来电添加最大字段宽度:
printf("%*s", i, string);
虽然您还没有显示打印发生的代码,但这可能是也可能不实用。
你可能也应该做一些错误检查。
答案 2 :(得分:1)
在完成后,请不要释放malloced内存。要回答你的问题,请始终为字符串中的终止空字节留出空间,并将最后一个字节设置为空字节。
fseek(fcode, 0, SEEK_END);
i=ftell(fcode);
//allocate for null byte too
square_scm = malloc(i + 1);
//reset the memory before using it
memset(square_scm, 0, i + 1);
fseek(fcode, 0, SEEK_SET);
fread(square_scm, 1, i, fcode);
square_scm[i] = 0; //not really required as we have already memset it
scheme_load_string(sc, square_scm);
//now you should free it, assuming it is not used anymore
free(square_scm);