如何将动态数组(malloc)传递给函数?

时间:2012-01-14 20:19:28

标签: c malloc

我需要将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"))"

3 个答案:

答案 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)

  1. 您正在使用释放的指针,这会导致未定义的行为。您应该删除或移动free()来电。
  2. 从文件中读取后,您不会终止字符串。你应该null终止该字符串。类似的东西:

    square_scm[i] = 0;
    

    确保您已分配足够的空间以允许空终止符 - 这意味着在+1来电中添加malloc()

    或者,您可以为printf()来电添加最大字段宽度:

    printf("%*s", i, string);
    

    虽然您还没有显示打印发生的代码,但这可能是也可能不实用。

  3. 你可能也应该做一些错误检查。

答案 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);