字符数组和指针之间的差异
Difference between character array and pointer
我在这两个代码中都做了同样的事情。
在代码1中:我使用了char *
,并在main
中使用malloc
分配空间。
在代码2中:出于同样的目的,我使用了char
数组。但为什么输出不同呢?
代码1:
struct node2
{
int data;
char p[10];
}a,b;
main()
{
a.data = 1;
strcpy(a.p,"stack");
b = a;
printf("%d %sn",b.data,b.p); // output 1 stack
strcpy(b.p,"overflow");
printf("%d %sn",b.data,b.p); // output 1 overflow
printf("%d %sn",a.data,a.p); // output 1 stack
}
代码2:
struct node1
{
int data;
char *p;
}a,b;
main()
{
a.data = 1;
a.p = malloc(100);
strcpy(a.p,"stack");
b = a;
printf("%d %sn",b.data,b.p); //output 1 stack
strcpy(b.p,"overflow");
printf("%d %sn",b.data,b.p); // output 1 overflow
printf("%d %sn",a.data,a.p); // output 1 overflow(why not same as previous one?)
}
在第二个示例中,将a
分配给b
,这意味着将a.p
(char*
)分配给b.p
。因此,修改b.p
指向的内存也就是修改a.p
指向的内存,因为它们都指向内存中的同一位置。
在第一个示例中,您有两个独立的数组。将a
分配给b
会将数组a.p
中的每个char
复制到b.p
——这些内存块是struct
的一部分,它们不是指向内存中特定部分的指针。在这种情况下,对b.p
的任何修改都不会影响a.p
,因为它们完全无关。
在您的第一个代码中,结构包含一个实际的字符数组(char[10]
),因此当您复制结构(b = a
)时,数组也会被复制。然后覆盖其中一个,但不覆盖另一个。
在第二个代码中,结构包含一个指向字符的指针,因此当您复制结构时,指针会被复制,但数据不会。所以两者都指向相同的数据。
字符指针和字符数组不是一回事。
带有数组的节点将被复制,因此内容将被复制到新节点中。当您将新值(溢出)放入复制的节点(b)时,它只会覆盖副本。
具有字符指针的节点正在复制指针的值,因此两个节点都指向相同的内存位置。当您将新值(溢出)放入复制的节点(b)中时,它会写入两个节点都有指针指向的内存。
相关文章:
- 在 const 函数中通过引用和指针返回之间的区别
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- AVX 指令中寄存器和指针之间的客观差异
- 禁止指针和整数之间的比较C++
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- ISO C++禁止指针和整数 [-fpermissive] [c++] 之间的比较
- 类指针之间的 Qt 差异
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 在两个.cpp文件之间定义全局类/结构指针
- 按值和引用传递指针之间的区别?
- 在硬件SIMD矢量指针和相应类型之间进行"interpret_cast"是一种未定义的行为吗
- 在C++中的程序之间共享指针
- 指针和程序性能之间有什么关系吗?
- Qt 错误 iso c++ 禁止指针和整数之间的比较 -permissive
- 可以在指向不同模板类实例的指针之间进行强制转换吗
- C++17:unique_ptr<char[]> 和 shared_ptr<char[] 之间的指针存储差异>
- 错误:ISO C++禁止在指针和整数 [-fallowive] 之间进行比较