c-动态数组malloc清空单独的数组



我在使用动态数组和malloc时遇到问题。我是C的新手,所以请原谅(并建议)任何新手的错误。

问题是我创建了一个数组(在本例中为input_string)并将其传递给func2。然后在func2中,我做了一个测试,打印出input_string的第一个元素。

这在malloc之前的第一次打印输出中起到了预期的作用,但在malloc之后,它不会打印任何内容。这对我来说似乎很奇怪,因为在toprintf语句之间,我对input_string不做任何操作。

我假设我错误地处理了这些数组,但我不确定。

以下是有问题的代码片段:

更新

... // includes not in snippet
/* CONSTANTS */
#define LINE_LEN 80
/* Function declarations */
char* func1(void);
char* func2(int tl, char* input_string);
int main(void) {
char* input_string;
int tab_length;
char* output_string;
input_string = func1();
output_string = func2(tl, input_string);
return 0;
}
char* func1(void) {
char cur_char;
char* input_ptr;
char input_string[LINE_LEN];
while ((cur_char = getchar()) != 'n' && chars_read < 80) {
// iterate and create the array here
}
input_ptr = &input_string[0]; /* set pointer to address of 0th index */
return input_ptr;
}
char* func2(int tl, char* input_string) {
int n = 0, output_idx = 0;
char* output_ptr;
printf("nBefore malloc: %c ", *(input_string));
output_ptr = malloc(tab_length * chars_read+1);
if (output_ptr == NULL) {
printf("Failed to allocate memory for output_ptr.nExiting");
exit(1);
}
printf("nAfter malloc: %c ", *(input_string));
...
return output_ptr;
}

附言:任何未声明的变量都是在这段代码之外声明的。

更新

感谢您的回复和建议。非常感谢。

func1返回指向临时字符串的指针。您没有分配它。这将产生未定义的行为。

相反,你应该这样做:

char* func1(void) {
char cur_char;
char* input_ptr = (char*)malloc(LINE_LEN * sizeof(char));
while ((cur_char = getchar()) != 'n' && chars_read < 80) {
// iterate and create the array here
}
return input_ptr;
}

有趣的是,您确实在func2中使用了malloc

完成后,您需要调用free来释放内存。

int main(void) {
char* input_string;
int tab_length;
char* output_string;
input_string = func1();
output_string = func2(tl, input_string);
free(input_string);
free(output_string);    
return 0;
}

一个主要问题是在中返回一个指向本地数组的指针

char* func1(void)
{
char cur_char;
char* input_ptr;
char input_string[LINE_LEN];
while ((cur_char = getchar()) != 'n' && chars_read < 80) {
// iterate and create the array here
}
input_ptr = &input_string[0]; /* set pointer to address of 0th index */
return input_ptr;
}

您已经将input_ptr设置为指向本地数组input_string(它的第零个元素),然后返回该指针。一旦函数返回,指针就无效;该空间被重新用于其他目的。

如果您无论如何都没有得到编译器警告,那么您应该在编译时设置更多的警告(并且在您知道足够的C来知道为什么可以安全地忽略警告之前,您不应该忽略警告)。我几乎总是使用-Wall -Wextra,而-Wall基本上总是。


正如Morpfh所指出的,GCC(在Mac OS X 10.7.4上测试的4.7.1)不会对返回指针发出警告,因此您必须在没有编译器帮助的情况下意识到这一点。(如果将返回值更改为return input_string;return &input_string[0];,则编译器会向您发出有用的警告。)

此外,在将代码转换为可编译单元时,我注意到您没有处理EOF,而是将getchar()的结果分配给char;您不应该这样做,因为它返回了一个int(有关此问题的另一个讨论,请参阅"fgetc()检查EOF"以及许多其他问题)。您还需要确保您的字符串以null结尾。您还应该避免重复常量,因此与其在条件中使用80,不如使用LINE_LEN(或者更好的sizeof(input_string)-1)。您必须注意一个缓冲区溢出。所以,我的func1()的可编译版本是:

#include <stdio.h>
#include <stdlib.h>
#define LINE_LEN 80
extern char *func1(void);
char *func1(void)
{
int cur_char;
char *input_ptr;
int chars_read = 0;
char input_string[LINE_LEN+1];
while ((cur_char = getchar()) != EOF && cur_char != 'n' && chars_read < LINE_LEN)
input_string[chars_read++] = cur_char;
input_string[chars_read] = '';
input_ptr = &input_string[0]; /* set pointer to address of 0th index */
return input_ptr;
}

这仍然是损坏的代码,因为它返回了本地指针。

相关内容

  • 没有找到相关文章

最新更新