关于char *p = "";的思考

本文探讨了`char *p = "";`这样的初始化方式,指出它为字符串常量分配了一个长度为1的内存空间,包含了终止符``。通过代码测试展示了sizeof运算符在此情况下的行为,并强调尝试修改此空间内容会导致非法操作,如Segmentation fault。
摘要由CSDN通过智能技术生成

偶然记起在浏览别人的代码的时候发现有一处指针的初始化时这样写的:

char *p = "";

首先我们知道char *p = NULL;的意思是将p初始化为NULL(和'\0', 0)的意思一样,防止使用野指针p。不过char *p = "";又是什么意思呢?

main.c测试如下:

char *p = "";
printf("+++++++0x%08x\n", p);
printf("+++++++0x%08x\n", &p);
printf("+++++++%d\n", strlen(p));
printf("+++++++%d\n", *p);
printf("++++

好的,我来回答你的问题。 首先,我们需要定义链串的结构体。链串结构体包含两个成员变量:一个指向下一个节点的指针和一个字符型变量,表示该节点存储的字符。定义如下: ```c typedef struct node { char data; struct node *next; } Node, *LinkString; ``` 接下来,我们可以初始化链串,也就是创建一个空的链串。这里我们可以使用 malloc 函数动态分配内存。初始化代码如下: ```c LinkString initString() { LinkString s = (LinkString)malloc(sizeof(Node)); s->next = NULL; return s; } ``` 接着,我们需要编写一个函数来给链串赋值。这里我们使用头插法来构建链表,因为头插法比较简单,而且可以保持字符串的顺序不变。同时,每插入一个节点,我们需要更新链串的长度。函数代码如下: ```c void assignString(LinkString s, char *str) { int len = strlen(str); for (int i = 0; i < len; i++) { Node *p = (Node*)malloc(sizeof(Node)); p->data = str[i]; p->next = s->next; s->next = p; } s->len = len; // 将字符串长度赋给链串的长度 } ``` 最后,我们需要编写一个函数来打印链串的内容,即遍历链表。代码如下: ```c void printString(LinkString s) { Node *p = s->next; while (p != NULL) { printf("%c", p->data); p = p->next; } printf("\n"); } ``` 完整代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct node { char data; struct node *next; } Node, *LinkString; LinkString initString() { LinkString s = (LinkString)malloc(sizeof(Node)); s->next = NULL; return s; } void assignString(LinkString s, char *str) { int len = strlen(str); for (int i = 0; i < len; i++) { Node *p = (Node*)malloc(sizeof(Node)); p->data = str[i]; p->next = s->next; s->next = p; } s->len = len; // 将字符串长度赋给链串的长度 } void printString(LinkString s) { Node *p = s->next; while (p != NULL) { printf("%c", p->data); p = p->next; } printf("\n"); } int main() { LinkString s = initString(); char *str = "hello, world!"; assignString(s, str); printString(s); return 0; } ``` 这样,我们就成功地使用 C 语言编写了一个链串,并实现了初始化、赋值、遍历等基本操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值