Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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
如何将char*发送到函数并让它更改C中char*的内容?_C_String_Reference_Char_Pointers - Fatal编程技术网

如何将char*发送到函数并让它更改C中char*的内容?

如何将char*发送到函数并让它更改C中char*的内容?,c,string,reference,char,pointers,C,String,Reference,Char,Pointers,我在网上尝试和搜索太久了,但没有成功。我试过很多建议的答案,但都不管用 我想基本上发送一个char*。如果需要,它可以将其设为NULL,但更希望函数修改已经有内容的char* 例如: char *old = "kit"; function(old){ //does stuff and writes "kat" to old} printf("new = %s", old); 及 我该怎么做 谢谢 编辑: 我目前正在尝试的是: calling_function(char *in){ ch

我在网上尝试和搜索太久了,但没有成功。我试过很多建议的答案,但都不管用

我想基本上发送一个
char*
。如果需要,它可以将其设为NULL,但更希望函数修改已经有内容的
char*

例如:

char *old = "kit";
function(old){ //does stuff and writes "kat" to old}

printf("new = %s", old);

我该怎么做

谢谢

编辑:

我目前正在尝试的是:

calling_function(char *in){ 
  char **old = NULL;
  function(&old);
  printf("old in calling function is now = %s", *old);
}

function(**old){
  <does stuff to get char *another_string = "kat">
  *old = another_string;
  printf("old is now = %s ", *old);
}

并且它立即存在于系统中,带有未指定的错误出口(-1),然后挂起。

您可以将函数原型更改为

void myFunction(char** pold)
在这个函数中,你可以自由地写

*pold = "kat";
并像这样调用函数:
myFunction(&old)

但要小心;这种方法有危险:

1) 您可能会泄漏内存,因为上一个字符串(即,
旧的
最初指向的是什么?)可能会悬空


2)
*pold=“kat”将只读内存分配给
*pold
。这是因为“kat”可能是在程序启动时由C运行时库添加到字符串文本池中的。试图修改字符串(例如,
(*pold)[0]=“K”
)是未定义的行为。使用
*pold=strdup(“kat”)可避免此问题。

您可以将函数原型更改为

void myFunction(char** pold)
在这个函数中,你可以自由地写

*pold = "kat";
并像这样调用函数:
myFunction(&old)

但要小心;这种方法有危险:

1) 您可能会泄漏内存,因为上一个字符串(即,
旧的
最初指向的是什么?)可能会悬空


2)
*pold=“kat”将只读内存分配给
*pold
。这是因为“kat”可能是在程序启动时由C运行时库添加到字符串文本池中的。试图修改字符串(例如,
(*pold)[0]=“K”
)是未定义的行为。使用
*pold=strdup(“kat”)绕过了这个问题。

字符*
仅仅是一个指向某些字节的地址,然后这些字节被解释为字符串,如何做真正需要做的事情取决于你需要做什么

如果要更改字符串的字符,则使用普通的
char*
(非
const
)指针即可:

void function(char *data) {
  data[0] = 'a';
}
相反,如果要用另一个字符串(可能长度不同)替换整个字符串,则需要传递包含该地址的地址,以便可以直接将其替换为新地址(指向不同的字符串):


char*
仅仅是一个指向某些字节的地址,然后这些字节被解释为字符串,如何做真正需要的事情取决于你需要做什么

如果要更改字符串的字符,则使用普通的
char*
(非
const
)指针即可:

void function(char *data) {
  data[0] = 'a';
}
相反,如果要用另一个字符串(可能长度不同)替换整个字符串,则需要传递包含该地址的地址,以便可以直接将其替换为新地址(指向不同的字符串):


传递
整数作为参考的示例如下:

例如,可以在函数中更改值,如下所示:

char *old = "kit";
/* this will print kit */
printf("old = %s",old);
function(old);
/* this will print kat */
printf("updated old = %s", old); 

function(char *old) {
   *old = "kat"
}

传递
整数作为参考的示例如下:

例如,可以在函数中更改值,如下所示:

char *old = "kit";
/* this will print kit */
printf("old = %s",old);
function(old);
/* this will print kat */
printf("updated old = %s", old); 

function(char *old) {
   *old = "kat"
}
线路

char *old = "kit";
可能会导致问题,因为old可能指向只读内存。您要做的是:

char old[128]; // or however many you need
function(old){ //does stuff and writes "kat" to old // You can use sprintf for this} 

printf("new = %s", old);
它将在堆栈上分配
旧的
,在那里可以对其进行修改。

char *old = "kit";
可能会导致问题,因为old可能指向只读内存。您要做的是:

char old[128]; // or however many you need
function(old){ //does stuff and writes "kat" to old // You can use sprintf for this} 

printf("new = %s", old);

它将在堆栈上分配
旧的
,在那里可以对其进行修改。

这将获取现有的字符*并对其进行更改。 char*old=“kit”

不过要小心。请记住,您实际上是在处理数组,而函数不知道数组的大小。您始终希望保持在数组的边界内

因此,您应该使功能更高级:

void changingFunction( char* pointer ) {
    char * newString = "kat";
    strncpy(pointer, newString, strlen(pointer));
}

通过使用strncpy,您可以确保您保持在边界内,并且由于您处理的是以null结尾的字符*,因此可以使用strlen来确定您的边界有多大。

这将获取一个现有字符*,并对其进行更改。 char*old=“kit”

不过要小心。请记住,您实际上是在处理数组,而函数不知道数组的大小。您始终希望保持在数组的边界内

因此,您应该使功能更高级:

void changingFunction( char* pointer ) {
    char * newString = "kat";
    strncpy(pointer, newString, strlen(pointer));
}

通过使用strncpy,您可以确保您保持在自己的边界内,并且由于您处理的是以null结尾的字符*,因此可以使用strlen来确定您的边界有多大。

通过尝试回答这个问题,我学到了一些东西!下面是我执行操作的程序:

#include <stdio.h>

void f(char* str)
{
    strcpy(str, "kat");
}

int main(void) {
    // char* str = "kit"; // Initializing like this causes a crash!

    char str[4]; // This initialization works
    strcpy(str, "kit");

    f(str);
    printf(str); // Prints "kat"

    return 0;
}
#包括
空f(字符*str)
{
strcpy(str,“kat”);
}
内部主(空){
//char*str=“kit”//这样初始化会导致崩溃!
char str[4];//此初始化有效
strcpy(str,“kit”);
f(str);
printf(str);//打印“kat”
返回0;
}
安全性方面存在明显的问题,但令我感到奇怪的是,如果使用注释掉的行声明
str
,程序就会崩溃。我没有意识到初始化这样的字符串文本会给您一个指向只读内存的指针。这对我来说很不明显,所以当我的小程序崩溃时我很困惑


我认为首先指出这一事实是很重要的,因为这是为什么天真的解决方案不一定能奏效的关键。有趣。

通过回答这个问题,我学到了一些东西!下面是我执行操作的程序:

#include <stdio.h>

void f(char* str)
{
    strcpy(str, "kat");
}

int main(void) {
    // char* str = "kit"; // Initializing like this causes a crash!

    char str[4]; // This initialization works
    strcpy(str, "kit");

    f(str);
    printf(str); // Prints "kat"

    return 0;
}
#包括
空f(字符*str)