我需要将一个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"))"
您的free()
是一场灾难;当你完成数据时,你只free()
。
您可能在检查返回代码时出错,至少是malloc()
和fread()
。
从文件中读取的数据不会以null终止。您需要按一个字节进行超额分配,并在将数据读取到分配的缓冲区后添加终端NUL(' '
)。(请注意,文件在打开后可能已经收缩;请注意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
数据传递给该函数,因为无论哪种方式都不会对其进行修改。
- 您正在使用一个释放的指针,这会导致未定义的行为。您应该删除或移动
free()
调用 -
从文件中读取字符串后,终止字符串不是null。您应该以null终止该字符串。类似于:
square_scm[i] = 0;
确保您已经分配了足够的空间来允许使用null终止符——这意味着向
malloc()
调用添加一个+1
。或者,您可以在
printf()
调用中添加最大字段宽度:printf("%*s", i, string);
虽然您还没有显示打印发生的代码,所以这可能实用,也可能不实用。
您可能还应该做一些错误检查。
在处理完mallocated内存之前,不要释放它。要回答您的问题,请始终为字符串中的终止空字节留出空间,并将最后一个字节设置为空字节。
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);