小编Noo*_*der的帖子

对于未使用的参数,什么是“更好的”:(x=x) 或 (void(x))?

好吧,我们都知道有时我们会获取函数的参数,但我们并没有真正使用它们。

我们不想得到任何编译器警告,所以我们需要以某种方式“使用”但不真正使用这些参数。

我们有两种选择:

#define UNUSED(x) (void)(x)

#define UNUSED(x) (x=x)

和一般,定义(x=x)void(x)在功能,即使没有#define

问题是:

其中哪一个是“更好的”?

更好的性能(更快),内存分配(如果有),任何你能想到的技术上的说法。

c memory variables performance void

2
推荐指数
1
解决办法
140
查看次数

C 中带有条件运算符的表达式的类型是什么?

假设我们有以下表达式:

(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 种不同的类型。

c types conditional-operator

1
推荐指数
1
解决办法
74
查看次数

即使我尝试在 C 中创建文件,也找不到文件时出现分段错误

我正在编写将文本附加到文件的代码。它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)

c fopen file segmentation-fault argv

1
推荐指数
1
解决办法
60
查看次数

如何在 C 中打印 (void **) 数据?

我很难完全理解和学习指针、强制转换和所有这些的行为。

我有以下结构,它基本上是一个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的任何提示。我的意思是,我认为我很擅长它,但我想我错了。 …

c stack pointers void-pointers data-structures

0
推荐指数
1
解决办法
49
查看次数