当前位置: 首页 > news >正文

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 <stdio.h>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 <stdio.h>
#include<string.h>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[ ][ ]。

http://www.lryc.cn/news/123486.html

相关文章:

  • 一、Kubernetes介绍与集群架构
  • 基于C#UI Automation自动化测试
  • 深入了解Linux运维的重要性与最佳实践
  • 90 | Python人工智能篇 —— 深度学习算法 Keras基于卷积神经网络的情感分类
  • 自然语言处理从入门到应用——LangChain:记忆(Memory)-[记忆的类型Ⅲ]
  • 【ARM 嵌入式 编译系列 10.3 -- GNU elfutils 工具小结】
  • 黑马项目一阶段面试 项目介绍篇
  • 重构内置类Function原型上的call方法
  • Nginx之lnmp架构
  • C# 使用FFmpeg.Autogen对byte[]进行编解码
  • websocket是多线程的嘛
  • CentOS7.9 禁用22端口,使用其他端口替代
  • 2023国赛 高教社杯数学建模ABCDE题思路汇总分析
  • 【网络层+数据链路层】深入理解IP协议和MAC帧协议的基本原理
  • 银行家算法【学习算法】
  • 萤石直播以及回放的接入和销毁
  • C语言易错知识点总结2
  • Go学习-Day1
  • 冠达管理:机构密集调研医药生物股 反腐政策影响受关注
  • 安装Tomac服务器——安装步骤以及易出现问题的解决方法
  • JVM 性能优化思路
  • Labview解决“重置VI:xxx.vi”报错问题
  • 2023河南萌新联赛第(五)场:郑州轻工业大学C-数位dp
  • 找不到mfc140u.dll怎么办?mfc140u.dll丢失怎样修复?简单三招搞定
  • 了解 Langchain️是个啥?:第 1 部分
  • Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库
  • 【JAVA】我们常常谈到的方法是指什么?
  • 今天来给大家聊一聊什么是Hierarchical-CTC模型
  • cout还是printf?C++教程 - How to C++系列专栏第4篇
  • Linux NTP原理及配置使用