如何在C中返回未知大小的数组

时间:2015-12-05 07:42:02

标签: c arrays

我想编写一个小型C程序,要求用户输入数字There are 2 duplicate values. A total of 5 elements are doublets,然后打印出某些固定字符串length_input的第一个length_input个字符。

现在,此代码不起作用。它编译得很好,但它总是打印一个空行而不是string_input

"AB"

我认为那是因为我在#include <stdio.h> #include <stdlib.h> char* take (char* string, int length) { char* local_string = malloc(length); for (int i = 0; i < length; i++) { local_string[i] = string[i]; } return local_string; } int main (int arg, char** args) { char* string_input; char* string_output; int length_input; printf("> "); scanf("%s", &length_input); string_input = "ABCDEFG"; string_output = malloc(length_input); string_output = take(string_input, length_input); printf(string_output); printf("\n"); return 0; } 中返回一个局部变量,不是吗?我还读过,将指针take声明为静态变量会有所帮助。我知道它的分配大小必须在编译时知道,这会使程序变得毫无意义。

事情是local_string的调用应该更改take过程的任何局部变量,或者更准确:它应该改变main过程定义的任何内容 - 无论是在堆栈上还是在堆上。所以我需要返回一个指向堆中新地址的新指针,而不是更改现有地址的值。 (为什么?这是一个实验。)

有可能做我想要的吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:3)

首先考虑一下scanf

的作用
scanf("%s", &length_input);

它接受输入文本并将其转换为字符串(%s)(它已经是什么),然后将其存储在&amp; length_input(整数的地址)中。可能不是你想要的。

注意:length_input可能仍为'0'(其初始值)

然后它不分配内存(malloc(0));但是,由于大多数malloc都有最小的alloc大小,你确实得到了一些东西。

接下来调用'take'来运行循环一次以获得数组中的第一个条目('AB')并将其存储在幸运缓冲区中。

然后你没有释放你的游戏内容;所以,你可能泄露了记忆。

你有几件事需要解决;但是,它完成了你所说的。

答案 1 :(得分:1)

您的UIView.animate(withDuration: 0.5) { () -> Void in self.settingsButton.transform = CGAffineTransform(rotationAngle: CGFloat.pi) } UIView.animate(withDuration: 0.5, delay: 0.45, options: UIViewAnimationOptions.curveEaseIn, animations: { () -> Void in self.settingsButton.transform = CGAffineTransform(rotationAngle: CGFloat.pi * 2.0) }, completion: nil) 功能正常。但是他们调用它的方式并不好。你应该这样做:

take

否则最终会导致内存泄漏。