c语言中的字符串更新
这是一个示例程序,演示如何从func获取字符串值c语言中的字符串更新,c,string,C,String,这是一个示例程序,演示如何从func获取字符串值 可以在调用的函数本身内部分配内存并返回 可以在调用函数内部分配内存,而被调用函数只是更新它 我面临第二条路的问题。 有什么解决办法吗 /* * main.c * * Created on: Sep 6, 2014 * Author: Murtaza */ #include<stdio.h> #include<stdlib.h> char* someFunc1(); void someFunc2(cha
/*
* main.c
*
* Created on: Sep 6, 2014
* Author: Murtaza
*/
#include<stdio.h>
#include<stdlib.h>
char* someFunc1();
void someFunc2(char* str);
void firstApproach();
void secondApproach();
int main()
{
firstApproach();
printf("\n");
secondApproach();
return 0;
}
char* someFunc1()
{
char *str = (char*)malloc(sizeof(char)*10);
str = "HELLO";
return str;
}
void someFunc2(char* str)
{
str = "Hello";
}
void secondApproach()
{
char *str = (char*)malloc(sizeof(char)*10);
someFunc2(str);
printf(str);
printf("heythere");
}
void firstApproach()
{
char *str;
str=someFunc1();
printf(str);
printf("wassup");
}
我的预期产出应该是
HELLOwassup
Helloheythere
在引号之间写入字符串并将其直接用作:
- char*->它在内存中的可变位置创建,并将其地址提供给分配给它的指针变量。只要引用它的变量不为NULL,它就仍然在内存中
- 参数->它被创建为
并传递给函数(并在函数中被视为char*),然后自动从内存中释放(即,您不能再访问或引用它)char*
char[]
,然后在只读内存中创建并复制到堆栈中。。(堆栈上的副本是char[]
变量将指向的副本)
如果您想了一段时间,就会意识到这是动态内存的好处之一:您可以创建一个可变的char*
,因为它只是一个指针,您不需要指定它要指向的字符串的大小。所以你可以看到这是多么有用
此外,值得注意的是,在函数中:
- 如果传递字符串,函数本身中的变量将被视为char指针,很可能会尝试修改它,如果它是只读的,则会引发分段错误。所以函数假设你知道你在做什么
- 如果您希望函数能够直接修改字符串(即string=“somestring”),则向其传递指向实际字符串的指针,否则修改将仅限于函数的本地。这是因为字符串是“指向char的指针”,所以函数不能整体修改字符串。但这也意味着函数可以单独修改字符串的字符(显然,因为它有一个字符指针:字符串)。但是,如果传递字符串指针(
),函数可以直接修改字符串(char**
),也可以单独修改字符(*string=“which”
)。您需要的选择完全取决于函数的用途*string[1]='C'
void someFunc2(char*str)
{
char*k=“你好”;
对于(int i=0;i<5;++i)
str[i]=k[i];
}
这是C语言中最具争议和最高级的话题之一。无论你在做什么类型的C语言编程,你都必须理解这些核心概念。当你在引号之间写一个字符串并直接将其用作:
- char*->它在内存中的可变位置创建,并将其地址提供给分配给它的指针变量。只要引用它的变量不为NULL,它就仍然在内存中
- 参数->它被创建为
并传递给函数(并在函数中被视为char*),然后自动从内存中释放(即,您不能再访问或引用它)char*
char[]
,然后在只读内存中创建并复制到堆栈中。。(堆栈上的副本是char[]
变量将指向的副本)
如果您想了一段时间,就会意识到这是动态内存的好处之一:您可以创建一个可变的char*
,因为它只是一个指针,您不需要指定它要指向的字符串的大小。所以你可以看到这是多么有用
此外,值得注意的是,在函数中:
- 如果传递字符串,函数本身中的变量将被视为char指针,很可能会尝试修改它,如果它是只读的,则会引发分段错误。所以函数假设你知道你在做什么
- 如果您希望函数能够直接修改字符串(即string=“somestring”),则向其传递指向实际字符串的指针,否则修改将仅限于函数的本地。这是因为字符串是“指向char的指针”,所以函数不能整体修改字符串。但这也意味着函数可以单独修改字符串的字符(显然,因为它有一个字符指针:字符串)。但是,如果传递字符串指针(
),函数可以直接修改字符串(char**
),也可以单独修改字符(*string=“which”
)。您需要的选择完全取决于函数的用途*string[1]='C'
void someFunc2(char*str)
{
char*k=“你好”;
对于(int i=0;i<5;++i)
str[i]=k[i];
}
这是C语言中最具争议和最高级的话题之一。无论你在做什么类型的C语言编程,你都必须理解这些核心概念。让我们仔细看看
someFunc2
:
void someFunc2(char* str)
{
/* str is a copy of the pointer that was passed in from secondApproach(). */
str = "Hello";
}
这里,您通过值传递指针。因此,someFunc2
中的str
是从secondApproach()
传入的原始指针str
的副本someFunc2
告诉复制指针指向其他地方,但它只保留原始str
指针。解决方案
void someFunc2(char* str)
{
str="Hello"; //-----the variable str is local to this function, thus it goes out of scope as
// soon as the function returns
}
void secondApproach()
{
char *str=(char*)malloc(sizeof(char)*10);
someFunc2(str);
printf(str); // -------------- here the value inside str is some garbage value.
printf("heythere");
}
CORRECTION :
void someFunc2(char **str )
{
*str = "hello";
}
void secondApproach()
{
char *str=(char*)malloc(sizeof(char)*10);
someFunc2(&str); // pass the address of the string
printf("%s", str);
printf("heythere");
}
void someFunc2(char** str)
{
*str = "Hello";
}
void someFunc2(char* str)
{
char *k = "Hello";
for(int i = 0; i < 5; ++i)
str[i] = k[i];
}
void someFunc2(char* str)
{
/* str is a copy of the pointer that was passed in from secondApproach(). */
str = "Hello";
}
void secondApproach()
{
char* str = (char*) malloc(sizeof(char) * 10);
someFunc2(&str); // Pass in the address of str.
printf("%s", str);
printf("heythere");
}
void someFunc2(char** str)
{
*str = "hello";
}