我想编写一个小型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
过程定义的任何内容 - 无论是在堆栈上还是在堆上。所以我需要返回一个指向堆中新地址的新指针,而不是更改现有地址的值。 (为什么?这是一个实验。)
有可能做我想要的吗?如果是这样,怎么样?
答案 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
否则最终会导致内存泄漏。