【发布时间】:2016-09-03 20:10:05
【问题描述】:
我正在尝试将 char[] 传递给函数并对其进行变异。下面的代码编译并按我的测试用例的预期工作,但我收到一些编译器警告,我不知道如何解决它们。
代码: #包括 #包括
#define MAX_STRING_SIZE 100
void strOp(char **someString) {
snprintf( someString, sizeof(someString), "HELLO");
}
int main() {
char myString[MAX_STRING_SIZE];
strOp(&myString);
printf("%s\n", myString);
return 0;
}
警告:
echoecho.c: In function ‘strOp’:
echoecho.c:18:3: warning: passing argument 1 of ‘snprintf’ from incompatible pointer type [enabled by default]
snprintf( someString, sizeof(someString), "HELLO");
^
In file included from echoecho.c:12:0:
/usr/include/stdio.h:386:12: note: expected ‘char * __restrict__’ but argument is of type ‘char **’
extern int snprintf (char *__restrict __s, size_t __maxlen,
^
echoecho.c: In function ‘main’:
echoecho.c:23:3: warning: passing argument 1 of ‘strOp’ from incompatible pointer type [enabled by default]
strOp(&myString);
^
echoecho.c:17:6: note: expected ‘char **’ but argument is of type ‘char (*)[100]’
void strOp(char **someString) {
我尝试了几种使用 *、*[] 和 ** 的组合,发现其中一些有效,但总是有警告。任何想法如何清理这个?
【问题讨论】:
-
Cist 严格按值传递。没有例外!而且您不能将数组传递给/从 C 中的函数传递。
-
sizeof(someString)是指针的大小。您需要单独传递大小。而且您的 1 星太多了,同时从传递的数组中删除了&。 -
您需要将
#include语句缩进 4 个空格,以便它们显示出来。 -
在 C 中,当引用一个数组时,例如在这一行中:
strOp(&myString);数组的名称降级为数组第一个字节的地址。所以贴出来的代码实际上是在传递一个指针指向一个指针,这是一个错误。 -
关于这一行:
snprintf( someString, sizeof(someString), "HELLO");'sizeof(someString)` 将返回指针的长度,而不是字符串的长度,建议使用:MAX_STRING_SIZE
标签: c arrays string pointers reference