【问题标题】:Pass char[] as reference in c将 char[] 作为 c 中的引用传递
【发布时间】: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


【解决方案1】:

将指针传递给 char

试试

#include<cstdlib>
#include<string.h>
#define MAX_STRING_SIZE 100

void strOp(char *someString) {
snprintf( someString,MAX_STRING_SIZE, "HELLO");
}

 int main() {
 char myString[MAX_STRING_SIZE];
 strOp(myString);
 printf("%s\n", myString);
 return 0;  
 }

【讨论】:

  • sizeof(someString) 的错误是 4 或 8,但不是您已经知道的 MAX_STRING_SIZE
  • 抱歉,strlen 不起作用,因为指针指向一个未初始化的字符串
  • 奇怪的是,这是我认为我首先尝试的,但由于某种原因没有得到变异的结果......一定是一些奇怪的错字。谢谢。
【解决方案2】:

在你的情况下,正确的做法是:

#define MAX_STRING_SIZE 100

void strOp(char *someString) {
  /* ... */
}

int main() {
  char myString[MAX_STRING_SIZE];
  strOp(myString);
  printf("%s\n", myString);
  return 0;
}

在处理数组时,通常不需要在它们上使用指针。

但是有办法做到这一点:

#include #include

#define MAX_STRING_SIZE 100

void strOp(char (*someString)[MAX_STRING_SIZE]) {
  /* ... */
}

int main() {
  char myString[MAX_STRING_SIZE];
  strOp(&myString);
  printf("%s\n", myString);
  return 0;
}

someString 是一个指向MAX_STRING_SIZEchar 数组的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2015-12-23
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多