好吧,我们都知道有时我们会获取函数的参数,但我们并没有真正使用它们。
我们不想得到任何编译器警告,所以我们需要以某种方式“使用”但不真正使用这些参数。
我们有两种选择:
#define UNUSED(x) (void)(x)
#define UNUSED(x) (x=x)
和一般,定义(x=x)或void(x)在功能,即使没有#define。
问题是:
其中哪一个是“更好的”?
更好的性能(更快),内存分配(如果有),任何你能想到的技术上的说法。
假设我们有以下表达式:
(x>y) ? printf("type of int") : func_string()
那么我们这里有什么?
x>y -> true -> printf("type of int") -> the type of the expression is int (because printf function is an int type function).
或者
x>y -> false -> calls func_string() function which for the purpose of the question, returns a string.
结论是,对于这个表达式的结果,我们只有 2 个选项:一个int function (prinf)OR 一个字符串function (func_string)。
这意味着表达式有 2 种可能的类型。
然而,编译器不能真正等到运行时才能获取表达式的类型,编译器不能真正编译代码,同时不确定表达式的类型是 int 还是 string,所以我们会得到一个如果我们尝试运行这种代码,则编译错误,条件运算符的 2 个结果有 2 种不同的类型。
我正在编写将文本附加到文件的代码。它fopen在开头使用,WriteToFile因此即使文件不存在,它也会创建它。
但是,当我根本没有输入文件时会发生什么?根本没有争论?只是./a.out?
分段故障。
我不知道为什么,在我看来,我所做的一切都很好,以避免出现任何问题。
int main(int argc, char **argv)
{
char file_name[30] = "file.txt";
printf("%s",file_name); /* for debugging : doesn't print it */
if (0 != argc)
{
strcpy(file_name, argv[1]);
}
WriteToFile(file_name);
}
Run Code Online (Sandbox Code Playgroud)
或者(以防我真的无法将字符串文字放入 char 数组中):
char file_name[30];
if (0 == argc)
{
strcpy(file_name, "file.txt");
}
else
{
strcpy(file_name, argv[1]);
}
Run Code Online (Sandbox Code Playgroud)
对于我得到的两种情况
Segmentation fault (core dumped)
我很难完全理解和学习指针、强制转换和所有这些的行为。
我有以下结构,它基本上是一个stack data structure:
struct stack
{
void **items;
size_t top;
size_t max_size;
};
Run Code Online (Sandbox Code Playgroud)
我希望能够返回top element,所以这是我的Peek功能:
void *Peek(const stack_ty *stack)
{
return(stack->items[stack->top]);
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试打印main.c:
stack_ty *new_stack = CreateStack(5);
Push(new_stack, (void *)1);
Push(new_stack, (void *)2);
Push(new_stack, (void *)3);
printf("The top element is %d\n", *(int *)Peek(new_stack));
Run Code Online (Sandbox Code Playgroud)
Segmentation fault (core dumped)它进入Peek函数后我得到了一个权利。
我猜这与*(int *)我对 的返回值所做的转换有关Peek(),但我想不出任何其他方式来print()或显示void *.传递的任何值。我的意思是,我必须将它投射到int *或char *或其他什么,对吗?
我在这里做错了什么?我很高兴听到有关如何更好地理解整件事pointers的任何提示。我的意思是,我认为我很擅长它,但我想我错了。 …