Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过指针传递字符串-不兼容参数_C_String_Pointers - Fatal编程技术网

C 通过指针传递字符串-不兼容参数

C 通过指针传递字符串-不兼容参数,c,string,pointers,C,String,Pointers,我试图将两个字符串传递给一个函数,该函数将第二个字符串复制到第一个字符串中。获取错误消息 "passing arguement 1/2 of 'CopyStrings'from incompatible pointer type - line 25. note: expected 'char*' but argument is of type 'char**' - line 8 这是我的密码: #include <stdio.h> #include <string.h>

我试图将两个字符串传递给一个函数,该函数将第二个字符串复制到第一个字符串中。获取错误消息

"passing arguement 1/2 of 'CopyStrings'from incompatible pointer type - line 25.
note: expected 'char*' but argument is of type 'char**' - line 8
这是我的密码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// a function that gets 2 strings and copies the second one into the first one


char CopyStrings(char* string1, char* string2)
{
  strcpy(string1, string2);

  return *string1;

}

int main()
{
  char* string1 = (char*)malloc(sizeof(char)*10);
  char* string2 = (char*)malloc(sizeof(char)*10);

  strcpy(string1, "ugabuga");
  strcpy(string2, "mukaluka");


  printf("%s", CopyStrings(string1, string2));


  free(string1);
  free(string2);
  return 0;

}
进入

程序启动了。

你真的想

CopyStrings(string1, string2)
它已经是
char*
了,您正在用符号和从中生成
char**

另一个问题是在您的函数中-应该是:

char* CopyStrings(char* string1, char* string2)
{
    strcpy(string1, string2);
    return string1;
}
(如果您想返回第一个字符串)。

您真的想

CopyStrings(string1, string2)
它已经是
char*
了,您正在用符号和从中生成
char**

另一个问题是在您的函数中-应该是:

char* CopyStrings(char* string1, char* string2)
{
    strcpy(string1, string2);
    return string1;
}
(如果要返回第一个字符串)。

更改

CopyStrings(&string1和&string2)

CopyStrings(string1、string2)

char*string1
,这里的
string1
是一个指针,当您传递地址时,如果指针是指向指针的指针,则它不是您的意思,形式参数应该是双指针。只传递指针就足够了

CopyStrings()
函数需要在执行strcpy()后向调用者返回一个
char*
字符串。这是修改后的

变化

CopyStrings(&string1和&string2)

CopyStrings(string1、string2)

char*string1
,这里的
string1
是一个指针,当您传递地址时,如果指针是指向指针的指针,则它不是您的意思,形式参数应该是双指针。只传递指针就足够了


CopyStrings()
函数需要在执行strcpy()后向调用者返回一个
char*
字符串。这是修改后的

OPs代码有几个问题:

在下面的代码中,大多数问题都被注释(并修复) 需要知道的一点是,在C语言中,数组名称降级为数组的地址。请尝试始终将指针传递给数组,而不是整个数组。
%s
转换运算符希望关联的参数是字符数组的地址

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// a function that gets 2 strings and copies the second one into the first one


char* CopyStrings(char* string1, char* string2)
{
  strcpy(string1, string2);
  return string1; // return pointer to string1
}

int main()
{
  char* string1 = malloc(10);  // char is always 1 so no need for sizeof(char)
  char* string2 = malloc(10);

  strcpy(string1, "ugabuga");
  strcpy(string2, "mukaluka");

  printf("%s\n", CopyStrings(string1, string2));

  free(string1);
  free(string2);
  return 0;
} // end function: main
#包括
#包括
#包括
//获取两个字符串并将第二个字符串复制到第一个字符串中的函数
char*CopyStrings(char*string1,char*string2)
{
strcpy(string1、string2);
return string1;//返回到string1的指针
}
int main()
{
char*string1=malloc(10);//char总是1,所以不需要sizeof(char)
char*string2=malloc(10);
strcpy(string1,“ugabuga”);
strcpy(string2,“mukaluka”);
printf(“%s\n”,CopyStrings(string1,string2));
自由(1);
自由(2);
返回0;
}//结束函数:main

OPs代码有几个问题:

在下面的代码中,大多数问题都被注释(并修复) 需要知道的一点是,在C语言中,数组名称降级为数组的地址。请尝试始终将指针传递给数组,而不是整个数组。
%s
转换运算符希望关联的参数是字符数组的地址

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// a function that gets 2 strings and copies the second one into the first one


char* CopyStrings(char* string1, char* string2)
{
  strcpy(string1, string2);
  return string1; // return pointer to string1
}

int main()
{
  char* string1 = malloc(10);  // char is always 1 so no need for sizeof(char)
  char* string2 = malloc(10);

  strcpy(string1, "ugabuga");
  strcpy(string2, "mukaluka");

  printf("%s\n", CopyStrings(string1, string2));

  free(string1);
  free(string2);
  return 0;
} // end function: main
#包括
#包括
#包括
//获取两个字符串并将第二个字符串复制到第一个字符串中的函数
char*CopyStrings(char*string1,char*string2)
{
strcpy(string1、string2);
return string1;//返回到string1的指针
}
int main()
{
char*string1=malloc(10);//char总是1,所以不需要sizeof(char)
char*string2=malloc(10);
strcpy(string1,“ugabuga”);
strcpy(string2,“mukaluka”);
printf(“%s\n”,CopyStrings(string1,string2));
自由(1);
自由(2);
返回0;
}//结束函数:main

不要在C中强制转换
malloc
。另外,通过在函数调用中执行
&string1
,您显然是在询问
char*
的地址,这传递了一个
char**
。啊,这是真的。你能解释一下为什么我不应该在这里使用malloc吗?使用malloc!=演员马洛克。不需要施放malloc,iirc会抑制某种警告,但我不太确定。这是不鼓励的。@Yíu您不应该从
malloc
强制转换结果,因为如果您忘记包含头,它将使您的代码编译(可能会严重崩溃)。(在这种情况下也不需要使用,因为您可以只编写
char string1[10];
并摆脱
免费
)。嗯,好的。但在本例中,我认为转换malloc是可以的,因为如果我排除函数/*并只打印我的字符串,程序运行良好。不要在C中转换
malloc
。另外,您显然是通过在函数调用中执行
&string1
来请求
char*
的地址,这传递了一个
char**
。啊,这是真的。你能解释一下为什么我不应该在这里使用malloc吗?使用malloc!=演员马洛克。不需要施放malloc,iirc会抑制某种警告,但我不太确定。这是不鼓励的。@Yíu您不应该从
malloc
强制转换结果,因为如果您忘记包含头,它将使您的代码编译(可能会严重崩溃)。(在这种情况下也不需要使用,因为您可以只编写
char string1[10];
并摆脱
免费
)。嗯,好的。但在这个例子中,我认为转换malloc是可以的,因为如果我排除函数/*并只打印我的字符串,程序运行良好。好的,谢谢。我已经改变了,但程序仍然崩溃/好的,谢谢。我已经改变了,但程序仍然崩溃/谢谢你的帮助,谢谢。但是,既然一个字符指针等于一个数组,那么为它分配内存是有意义的——还是我错了?@Yiu,你是对的。无论是char数组还是指向char的指针,内存分配都是必须的,但第一种情况可以是编译时,然后在运行时分配。感谢您的帮助,非常感谢。但是,既然一个字符指针等于一个数组,那么为它分配内存是有意义的——还是我错了?@Yiu,你是对的。无论是字符数组还是指向字符的指针,内存分配都是m