C语言char**,char*,char s[]赋值

目录

前言

赋值方法

char s[]:

char*

char**

问题

修改字符串常量


前言

char**,char*,char s[]赋值的方式是不同的,当你搞混的时候,系统会报出段错误(Segmentation Fault),所以有必要做一个总结。

赋值方法

char s[]:

char s[ ], char s[ ][ ]可以直接用字符串赋值,或单个单个的赋值,如:

    char a[3][8]={"okkmoo","iju44"};
    char b[8]={"iikkkk"};
    char c[8]="iikkk";
    char d[8];
    for(int i=0;i<7;i++)
    {
        d[i]=48+i;
        a[2][i]=48+i;
    }

错误赋值方法:

    char a[3][8]={"okkmoo","iju44"};
    a[2]="8987";//错误
    char d[8]="op";
    d="helloc";//错误

上述代码中的a[ 2 ],d 是不可改变的,如果想要赋值,可以单个单个元素赋值。

char*

char* 是字符串常量,或者是指针,可以直接赋值为字符串,或者让指针指向某个字符或字符数组har s[]。如:

    char b[8]={"iikkkk"};
    char*p="c";//后面自动跟一个空字符
    char*q=b;

注意,字符串常量不可以改变,但可以让char* 重新指向另一个字符串常量:

    char*p="c899555";
    p[0]='5';//错误
    p="plm";//正确

char**

首先,需要创建一个char**类型的指针变量。然后,为指针变量分配内存,使其能够存储char*类型的指针。最后,将char*类型的指针数组的元素逐个赋值给char**类型的指针。

下面是一个示例代码,演示了如何将char*类型的指针数组赋值给char**类型的指针:

#include 

void printArray(char** arr, int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("%s\n", arr[i]);
    }
}

int main()
{
    char* strings[] = {"Hello", "World", "Example"};
    int size = sizeof(strings) / sizeof(strings[0]);

    char** s = (char**)malloc(size * sizeof(char*));
    if (s == NULL)
    {
        printf("Memory allocation failed\n");
        return 1;
    }

    for (int i = 0; i < size; i++)
    {
        s[i] = strings[i];
    }

    printArray(s, size);

    free(s);

    return 0;
}

下面这行代码是错误的,尝试将字符串字面量赋值给char**类型的指针t。然而,字符串字面量是不能直接赋值给指针的。

char** t = {"53..7....","6..195..."} 

 可以改为:

char** t = (char**)malloc(2 * sizeof(char*));
t[0] = strdup("53..7....");
t[1] = strdup("6..195...");

问题

修改字符串常量

#include 
#include

void fun(char*s);

int main()
{
    char*s="okkmoo";
    fun(s);
    printf("%s",s);
    return 0;
}

void fun(char*s)
{
    s[0]='1';   //错误
}

在代码中,出现错误的地方是尝试修改一个字符串常量,这是不允许的。字符串常量是不可修改的。

main函数中,你定义了一个指向字符串常量的指针s,然后将它作为参数传递给fun函数。在fun函数内部,你尝试将s的第一个字符修改为'1',这违反了字符串常量的不可修改性。

为了修复这个问题,你可以s声明为一个字符数组而不是字符串常量

int main()
{
    char s[] = "okkmoo";  // 将s声明为字符数组
    fun(s);
    printf("%s", s);
    return 0;
}

char *s[ ]="123456",与上述一样,不可以改变。可以改声明为char s[ ][ ]。

你可能感兴趣的:(C语言笔记,c语言,算法,开发语言)