c语言中的字符串更新

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

这是一个示例程序,演示如何从func获取字符串值

  • 可以在调用的函数本身内部分配内存并返回
  • 可以在调用函数内部分配内存,而被调用函数只是更新它
  • 我面临第二条路的问题。 有什么解决办法吗

    /*
     * 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'
      )。您需要的选择完全取决于函数的用途

    现在,对于您的特定示例,您可以执行以下两种操作之一

    使用指向字符的指针(字符串指针) 使用指向char(字符串)的指针
    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'
      )。您需要的选择完全取决于函数的用途

    现在,对于您的特定示例,您可以执行以下两种操作之一

    使用指向字符的指针(字符串指针) 使用指向char(字符串)的指针
    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";
    }