数组指针为什么不能使用strcpy

本文探讨了一个C语言编程中的常见错误:使用未初始化的指针数组可能导致程序运行时崩溃。通过具体示例解释了为何将未分配内存的指针用作字符串复制的目标会导致问题,并提出了解决方案。

编程中遇到的问题,终于弄明白了:

例程说明如下:

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

int main(char argv,char *argc[])
{

    char *b[10]; //定义一个指针数组
    char str="hello world";

    strcpy(b[0],str);
    printf(b[0]);
    system("pause");
    return 0;


}

编译时不会出错,但是运行时会出错,你定义char *b[10]时b[10]的每个元素是一个指针,指向字符型的,但是指向的地址是随机的,是不确定的,所以strcpy(b[0],str);b[1]是一个指向字符的地址,这个地址是随机的,可能指向内存的任何地方,可能是不具有写权限的地址,如指令区,资源区等,那么运行会出错,或是影响了你的程序的其它数据,都会导致运行出错,安全的作法b声明为二维数组吧

<think>我们使用指针数组(即元素为指针数组)来存储星期字符串,而不是二维字符数组,主要基于以下原因: 1. **内存效率**:指针数组中的每个元素是一个指针(通常占4或8字节),指向字符串字面量的首地址。字符串字面量存储在程序的只读数据段,各字符串长度不同(如“星期三”占6字节,而“星期二”占6字节),若用二维数组需按最长字符串统一分配列宽(如中文字符每个占3字节,考虑结尾'\0',最长可能需要7字节,则二维数组需7*7=49字节)。指针数组仅需7个指针(约28或56字节)加上字符串本身,更节省内存。 2. **灵活性**:指针数组允许各字符串长度不同且无需预先设定最大长度,而二维数组必须固定列宽,可能造成空间浪费。 3. **可读性与维护性**:指针数组初始化更直观(如`char* weekdays[] = {"周三",...}`),修改字符串内容时无需调整数组结构。 示例对比: - 指针数组:`char* weekdays[] = {"星期三", "星期四", ...};` - 内存分布:数组元素为指针,每个指针指向独立存储的字符串常量。 - 二维数组:`char weekdays[7][10] = {"星期三", "星期四", ...};`(需预设列宽为10,即使实际字符串长度不一) 因此,使用指针数组更高效、灵活。 §§相关问题§§ 1. 在C语言中,指针数组与二维数组在内存分配上有何本质区别? 2. 如果频繁修改星期字符串(如切换语言),指针数组和二维数组哪种更合适? 3. 使用指针数组存储字符串时,如何避免因字符串常量不可修改而导致的潜在错误? 4. 除了星期名称,还有哪些常见场景适合使用指针数组代替二维数组? 5. 指针数组在处理多语言支持时有什么优势?</think>在C语言中,使用指针数组(`char* weekdays[]`)而不是二维字符数组(如`char weekdays[7][10]`)来存储星期名称,主要基于以下关键原因: 1. **内存效率** 指针数组仅存储指向字符串常量的指针(每个指针4/8字节),而二维数组需为每个字符串预留固定空间(如`[7][10]`需70字节)。即使字符串长度不同("星期三"6字节,"星期日"6字节),指针数组也能避免空间浪费。 2. **灵活性** 指针数组允许各元素指向不同长度的字符串常量,无需预先定义最大长度。而二维数组必须按最长字符串定义列宽,可能造成空间冗余。 3. **代码简洁性** 初始化更直观:`char* weekdays[] = {"星期三", "星期四"...}` 直接引用字符串常量,比二维数组的逐字符赋值或`strcpy`更简洁。 4. **只读性保证** 字符串常量存储在只读数据段,指针数组自然保持其不可修改性,防止意外写入导致崩溃(二维数组若在栈上则可被修改,可能引发逻辑错误)。 5. **性能优势** 通过指针直接访问字符串常量地址(如`weekdays[0]`返回地址值),比二维数组的行地址计算(`weekdays[i]`等价于`*(weekdays + i*row_size)`)更高效。 > 📌 **关键区别示例** > ```c > // 指针数组:7个指针 + 7个独立字符串 > char* ptr_arr[] = {"Wed","Thu"}; // 总内存 ≈ 7*8 + 各字符串长度 > > // 二维数组:固定分配7行x10列 > char arr_2d[7][10] = {"Wed","Thu"}; // 固定占用70字节 > ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值