C 为字符串指针分配内存?

C 为字符串指针分配内存?,c,c-strings,string-literals,function-definition,tolower,C,C Strings,String Literals,Function Definition,Tolower,我正在努力学习C语言的一些基础知识。我试着编译这个程序,结果发现了一个信号11错误。我知道这与内存分配有关,但我不确定如何正确使用malloc()来实现这一点。有人能帮忙吗 { char*string=“Lol”; 转换较低(字符串); printf(“%s\n”,字符串); 返回0; } 字符*转换\u低位(字符*字){ 对于(;*word;+++word)*word=tolower((char)*word);//J.F.塞巴斯蒂安 返回词; } 您正在给convert\u lower()一个

我正在努力学习C语言的一些基础知识。我试着编译这个程序,结果发现了一个信号11错误。我知道这与内存分配有关,但我不确定如何正确使用
malloc()
来实现这一点。有人能帮忙吗

{
char*string=“Lol”;
转换较低(字符串);
printf(“%s\n”,字符串);
返回0;
}
字符*转换\u低位(字符*字){
对于(;*word;+++word)*word=tolower((char)*word);//J.F.塞巴斯蒂安
返回词;
}

您正在给
convert\u lower()
一个指向字符串文本的指针,因此它将尝试修改只读内存。这就是为什么会出现运行时错误

您需要先创建字符串文本数据的可写副本,然后才能对其进行修改,例如:

char*literal=“Lol”;
char*string=malloc(strlen(literal)+1);
strcpy(字符串,文本);
转换较低(字符串);
printf(“%s\n”,字符串);
自由(弦);
可以使用
strdup()
进行简化,它将为您处理分配和复制:

char*string=strdup(“Lol”);
转换较低(字符串);
printf(“%s\n”,字符串);
自由(弦);
然后,您可以通过完全不分配任何动态内存来进一步简化此过程:

charstring[]=“Lol”;
转换较低(字符串);
printf(“%s\n”,字符串);

至少有两个严重错误

第一个是您不能更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为

char *string = "Lol";
convert_lower(string);
第二个是在函数中,传递的指针被更改。因此,函数返回一个指向终止零的指针,而不是指向字符串的开头

而不是铸造成焦炭

tolower((char)*word)
您需要强制转换为未签名字符

tolower( (unsigned char)*word)
该函数的定义如下

char * convert_lower( char *word ) 
{
    for ( char *p = word; *p; ++p ) 
    {
        *p = tolower( ( unsigned char )*p );
    }

    return word;
}
打电话给我

char string[] = "Lol";
puts( convert_lower(string) );
char *string = "Lol";
char *lower_case_string = convert_lower( string );

if ( lower_case_string != NULL ) puts( lower_case_string );

free( lower_case_string );
如果要复制原始字符串,将所有字符转换为小写,则函数可以按以下方式执行

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

//...

char * convert_lower( const char *word ) 
{
    char *result = malloc( strlen( word ) + 1 );

    if ( result != NULL )
    {
        char *p = result;
    
        while ( ( *p++ = tolower( ( unsigned char )*word++ ) ) != '\0' );
    }

    return result;
}