c - 指向字符串的指针意外更改其值

标签 c arrays string pointers malloc

我注意到,在用 malloc() 分配的数组中写入字符串时,它的值会发生变化。需要明确的是,这里是复制此“错误”的代码:

#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>

#define N (20)

int main()
{
   char * a_p;
   a_p = malloc( N * sizeof(char));
   printf(" * 01 pointer -> %p\n", a_p);
   a_p = "something";
   printf(" * 02 pointer -> %p\n", a_p);
   printf("-- TEST --\n");
   return 0;

}

执行时,输出为:

 * 01 pointer -> 0x1332010
 * 02 pointer -> 0x4006b9
-- TEST --

虽然我期待相同的值,因为我没有改变指针指向的位置(至少没有直接改变)。这在使用 free() 时会导致问题。木头下发生了什么?我错过了什么?如何以正确的方式做这些事情?

最佳答案

你的问题

您正在使用 malloc() 为您的指针分配内存,但随后您将您的指针变量分配给其他东西(“something”,它有自己的地址),而不是填充新分配的指针。

解决方案

您应该使用分配内存并在分配的内存中复制字符串的 strdup() 函数:

a_p = strdup("something");

或者 strcpy() 函数,它接受一个 malloc() 指针和一个要复制到指向内存中的字符串:

a_p = malloc(N * sizeof(char));
strcpy(a_p, "something");

关于c - 指向字符串的指针意外更改其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47971202/

相关文章:

c - 马尔可夫链测试与实现

arrays - 为什么 AS3 在 for 循环中创建新实例?

javascript - 用点、字母、数字对对象数组进行排序。我能够按数字排序,但混合值很难。不确定是否可以做对

javascript - 对包含 3 个元素的二维数组进行排序

string - MongoDB 字符串到 int

java - 使用 java8 特性为字符串创建一个字符计数数组

c - 是否有可能告诉 gcc 编译器忽略函数属性?或者加快编译时间?

c - malloc() 在 free() 之后重用内存位置,导致碎片化(?)

c - 是否可以将现有缓冲区映射到新文件?

java - 从文本文件中获取数据并将其放入锯齿状数组中