我可以通过以下方式将参数传递给C中的函数,而不会在ubuntu-64bit上使用gcc发出任何警告或错误:
void func(char* test){
// do something here
}
void main() {
func((char*) "smaps");
}
除了关于C ++的类似问题的一个评论之外,我没有找到很多关于将匿名参数传递给C中的函数的示例。我想在我的代码中使用这种技术(很多),它将在多个AMD64 / ARM设备上编译,因为它们可用(主要是基于debian的操作系统)。我的问题是,这是特定于编译器的吗?
输出gcc --version:
$ gcc --version
gcc (Ubuntu 6.3.0-12ubuntu2) 6.3.0 20170406
更新:尽管我认为4386427对我来说已经足够好了,但我会更多地解释这个问题,因为它被搁置了。我有一个脚本,它调用一个特定的函数,它接受一个char **作为参数。我认为我需要单独显式声明一个char **,并在每次调用该函数时通过名称将其传递给函数。我认为声明一个字符串并同时将它传递给该函数会更方便;类似的东西:
func( (char**) {"first_string", "second_string"} ).
我最初担心的是,这在C中是否允许,或者这是一个特定于编译器的功能? 4386427的回答表明它不是特定于编译器的,但是我应该小心传递给函数的char **是不可变的。
答案 0 :(得分:2)
C中的所有参数都按值传递。没有关于将值来自的原始对象传递给被调用函数的信息。从这个意义上讲,所有C参数都是匿名的;没有关于调用函数中使用的标识符的信息被传递。
在func((char*) "smaps");
中,字符串文字"smaps"
将转换为指向char
的指针。只有指针的值传递给func
。这是标准C.
(如果您确实希望将有关对象的信息传递给函数,则必须手动执行此操作。例如,您可以获取对象的地址并将结果指针传递给函数。或者您可以传递数字数组中元素与函数的关系,以及第一个元素的地址。)
(在C中,诸如"smaps"
之类的字符串文字会自动转换为指向其第一个字符的指针,因此您无需使用char *
强制转换手动转换它们。[此自动转换可以当字符串文字是sizeof
,_Alignof
或&
的操作数或用于初始化数组时,不会出现。])
答案 1 :(得分:1)
这取决于你在函数中做了什么。只要您不尝试修改test
指向的内容,就没有问题。为了表明无法更改,最好添加const
。
像这样代码很好:
#include <stdio.h>
void func(const char* test){
printf("%s\n", test);
}
int main(void) {
func("smaps1");
func("smaps2");
func("smaps3");
func("smaps4");
return 0;
}
但如果您尝试更改值,请执行以下操作:
void func(char* test){
test[0] = 'A';
printf("%s\n", test);
}
您有未定义的行为,因为修改字符串文字是未定义的行为。