每天认识一个函数(6)

本文详细解释了memset函数的作用,如何在C语言中使用memset初始化字符数组、结构体等内存区域,以及注意事项,包括添加空字符以确保有效字符串和结构体成员的正确处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、memset()函数

memset函数说明: 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。。

1.头文件:

                 #include <string.h>

2.格式:

                void *memset(void *str, int c, size_t n)

3.返回值:

                返回一个指向存储区 str 的指针。

4.参数解析:

        str →  指向要填充的内存块。

        c   →  要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。

        n   →  要被设置为该值的字节数。
以上来源:void *memset(void *str, int c, size_t n) - C语言在线手册 (dba.cn)

memset()函数通常用于初始化内存或者设置内存区域。以下是一些 常见案例:

示例一:初始化字符数组中的元素

#include <stdio.h>  
#include <string.h>  
  
int main() {  
    char arr[10];  
    memset(arr, 'A', 3);  //将整个数组
    printf(" array: %s\n", arr);  //打印初始化的数组
	//输出: array: AAA
    return 0;  
}

示例二:初始化字符数组

#include <stdio.h>  
#include <string.h>  
  
int main() {  
    char arr[10];  
    memset(arr, 'A', sizeof(arr));  //将整个数组初始化为字符‘A’
    printf("Initial array: %s\n", arr);  //打印初始化的数组
    return 0;  
}

输出结果:

Initial array: AAAAAAAAAAp@

注意:这里虽然数组被设置为'A',但由于C语言中字符串是以空字符('\0')结束的,而这里没有明确地添加空字符,所以这并不是一个有效的C字符串。

如何解决?在使用数组之前为其分配内存并正确地初始化它。

输出结果中的"p@"是内存中的内容,这可能是由于在数组arr之后紧跟着的其他内存区域的内容。为什么初始化数组的前3个元素时没有异常出现?字符数组是以空字符'\0'结尾的,我们只初始化了3个元素,而后面的内容是未初始化的,所以不会出现异常。

解决方法:手动添加空字符:在将字符数组设置为特定值之后,手动添加一个空字符('\0')作为字符串的结束标记。

#include <stdio.h>  
#include <string.h>  
  
int main() {  
    char arr[10];  
    memset(arr, 'A', sizeof(arr));  
	arr[sizeof(arr) - 1] = '\0'; // 添加空字符作为字符串结束标记  
    printf("Initial array: %s\n", arr);  
    return 0;  
}

输出:

Initial array: AAAAAAAAA


示例三:设置内存区域为零

#include <stdio.h>  
#include <string.h>  
  
int main() {  
    int arr[10];  
    memset(arr, 0, sizeof(arr));  //将整个数组初始化为零值
    printf("Array after setting to zero: ");  
    for (int i = 0; i < 10; i++) {  
        printf("%d ", arr[i]);  //打印初始化的数组中的每一个元素
    }  
    return 0;  
}

输出:

Array after setting to zero: 0 0 0 0 0 0 0 0 0 0 

示例四:初始化结构体

#include <stdio.h>  
#include <string.h>  
  
struct Person {  
    char name[50];  
    int age;  
};  
  
int main() {  
    struct Person p;  
    memset(&p, 0, sizeof(p));  // 初始化结构体 p 的内存区域为零值  
    strcpy(p.name, "LiMing");  // 设置 name 成员为 "LiMing"  
    p.age = 14;  // 设置 age 成员为 14  
    printf("Person: %s, Age: %d\n", p.name, p.age);  
    return 0;  
}

输出:

Person: LiMing, Age: 14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值