c-如何将动态数组(malloced)传递给函数



我需要将一个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数据传递给该函数,因为无论哪种方式都不会对其进行修改。

  1. 您正在使用一个释放的指针,这会导致未定义的行为。您应该删除或移动free()调用
  2. 从文件中读取字符串后,终止字符串不是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);

相关内容

  • 没有找到相关文章