【问题标题】:I can't edit a memory address in C我无法在 C 中编辑内存地址
【发布时间】:2020-06-02 03:44:34
【问题描述】:

我真的不知道如何表达标题,我想要的是从另一个重叠指针编辑一个指针中的字符串。

我想在这段代码中获得什么是1abcd abcd,但我得到的是123 abcd

#include <stdio.h>

int main() {

    char* x = (char*)malloc(4);
    x = "123";
    char*  y = (char*) x+1;
    y = "abcd";
    printf("%s %s",x,y);

}

【问题讨论】:

  • 你为x分配内存。然后你把那个记忆扔掉,把x指向一个字符串文字。您将y 指向字符串文字中的2。然后将 y 指向不同的字符串文字。实际上,代码是char *x = "123";,后跟char *y = "abcd";,然后是printf
  • 所写的代码等同于printf("%s %s", "123", "abcd");,除了在没有匹配freemalloc分配中也存在内存泄漏。
  • @user3386109 当然!我忘了使用strcpy()。那解决了它。我现在觉得自己很笨。
  • 我希望您没有更改为使用 strcpyabcd 复制到 y,因为没有足够的分配内存来容纳该字符串。
  • 我可能有......但它工作得很好,我是否在内存的其他地方弄乱了一些数据?

标签: c string pointers


【解决方案1】:

问题是你分配给y,然后你又分配给y

char *y = x+1;  // first assignment
y = "abcd";              // second assignment

y = "abcd"; 不是副本。它将指向const char[5] 字符串abcd 的指针分配给y

这里有类似的问题。

char *x = malloc(4);
x = "123";

x 首先从malloc 分配给内存,但随后被const char[4] 123 覆盖。 malloc 内存泄露。

如果你想复制到x指向的内存,你需要使用strcpy。但是,x 只有 4 个字节。你需要更多。

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

int main() {
    // Allocate memory
    char *x = malloc(6);

    // Copy "123" the heap memory pointed to by x.
    strcpy(x, "123");

    // Assign a pointer to x+1 to y.
    char *y = x+1;

    // Copy "abcd" to the heap memory pointed to by y.
    strcpy(y, "abcd");

    // x='1abcd' y='abcd'
    printf("x='%s' y='%s'\n",x,y);
}

请注意,当源字符串和目标字符串的长度未知时,使用strcpy 是不安全的。

【讨论】:

  • 感谢您的回答。当您说strcpy 不安全时,您的意思是因为它可能容易受到攻击?
  • @OriónGonzález C 不知道分配给xy 的内存量。 strcpy 将复制尽可能多的内容,而不考虑在目标中分配了多少内存。 strcpy(y, "abcd") 是安全的,因为它是固定的 5 个字节,我知道 y 分配了 5 个字节。 strcpy(y, "abcdef") 将尝试写入超过分配的 5 个字节。相反,使用像 C11 strcpy_s(s 表示“安全”)这样的长度限制函数来明确限制可以复制的数量。 strcpy_s(y, 5, some_string_of_dubious_size) 或非标准的strlcpy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2019-04-13
相关资源
最近更新 更多