更改C堆栈指针地址(指向)

问题描述 投票:0回答:1

我想我也许终于在指针理解上有了一点突破,但我正在努力解决一个看似简单的问题,我想让一个指针与另一个指针指向相同的内存地址,例如:

char* foo = "foo"; // memory address: 0x7ffdabc4dbf8
char* bar = "bar"; // memory address: 0x7ffdabc4dbf0

如何将 foo 指向与 bar 相同的地址?我知道如何更改该值,例如:

foo = bar; // foo is now "bar" but the memory address is the same as before

我做了一些实验:

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

void print_info(char* string1, char* string2) {
    printf("Memory address of string1: %p\n", &string1);
    printf("Memory address of string2: %p\n", &string2);
    printf("Value of string1: %s\n", string1);
    printf("Value of string2: %s\n", string2);
    printf("\n");
}

void change(char** ptr1, char** ptr2) {
    *ptr1 = *ptr2;
}

int main() {

    printf("Initial values: string1 = \"foo\" string2 = \"bar\"\n\n");

    char* string1 = "foo"; // Pointer to a string literal?
    char* string2 = "bar"; // Pointer to a string literal?

    print_info(string1, string2);

    // Modifying value, the pointer have the same memory address as before
    string1 = string2;
    printf("string1 = string2\n\n");

    print_info(string1, string2);

    string2 = "bas";
    printf("string2 = \"bas\"\n\n");

    print_info(string1, string2);

    change(&string1, &string2);
    printf("change(&string1, &string2)\n\n");

    print_info(string1, string2);

    char *ptr = string1;
    printf("char *ptr = string1\n\n");

    printf("Memory address of ptr: %p\n", &ptr);
    printf("Value of ptr: %s\n\n", ptr);

    printf("Trying to change pointers directly:\n\n");

    printf("&string1 = &string2\n");
    printf("GCC: error: lvalue required as left operand of assignment\n\n");
    //&string1 = &string2;

    printf("string1 = &string2\n");
    printf("GCC: warning: assignment to ‘char *’ from incompatible pointer type ‘char **’\n\n");
    string1 = &string2;
    print_info(string1, string2);

    printf("&string1 = *string2\n");
    printf("GCC: error: lvalue required as left operand of assignment\n\n");
    //&string1 = *string2;
    //print_info(string1, string2);

    printf("string1 = *string2\n");
    printf("GCC: warning: assignment to ‘char *’ from ‘char’ makes pointer from integer without a cast\n\n");
    //string1 = *string2;
    //print_info(string1, string2);
    printf("Segmentation fault (core dumped)\n\n");

    printf("*string1 = &string2\n");
    printf("GCC: warning: assignment to ‘char’ from ‘char **’ makes integer from pointer without a cast\n\n");
    *string1 = &string2;
    print_info(string1, string2);
    printf("Corruption?\n");

    return EXIT_SUCCESS;
}

输出:

Initial values: string1 = "foo" string2 = "bar"

Memory address of string1: 0x7fffc52760b8
Memory address of string2: 0x7fffc52760b0
Value of string1: foo
Value of string2: bar

string1 = string2

Memory address of string1: 0x7fffc52760b8
Memory address of string2: 0x7fffc52760b0
Value of string1: bar
Value of string2: bar

string2 = "bas"

Memory address of string1: 0x7fffc52760b8
Memory address of string2: 0x7fffc52760b0
Value of string1: bar
Value of string2: bas

change(&string1, &string2)

Memory address of string1: 0x7fffc52760b8
Memory address of string2: 0x7fffc52760b0
Value of string1: bas
Value of string2: bas

char *ptr = string1

Memory address of ptr: 0x7fffc52760d8
Value of ptr: bas

Trying to change pointers directly:

&string1 = &string2
GCC: error: lvalue required as left operand of assignment

string1 = &string2
GCC: warning: assignment to ‘char *’ from incompatible pointer type ‘char **’

Memory address of string1: 0x7fffc52760b8
Memory address of string2: 0x7fffc52760b0
Value of string1: � @
Value of string2: bas

&string1 = *string2
GCC: error: lvalue required as left operand of assignment

string1 = *string2
GCC: warning: assignment to ‘char *’ from ‘char’ makes pointer from integer without a cast

Segmentation fault (core dumped)

*string1 = &string2
GCC: warning: assignment to ‘char’ from ‘char **’ makes integer from pointer without a cast

Memory address of string1: 0x7fffc52760b8
Memory address of string2: 0x7fffc52760b0
Value of string1: � @
Value of string2: 

Corruption?

是否可以更改堆栈指针指向的地址?或者只能使用堆指针? (malloc?)

c pointers memory-management
1个回答
0
投票

定义之后

char* foo = "foo";
char* bar = "bar";

你的记忆看起来像这样

+-----+ +--------+
|富| ---->| “富”|
+-----+ +--------+

+-----+ +--------+
|酒吧| ---->| “酒吧”|
+-----+ +--------+

然后你做作业:

foo = bar;

这导致内存看起来像这样:

+-----+ +--------+
|富| -\ | “富”|
+-----+ | +--------+
         |
+-----+ | +--------+
|酒吧| ->-->| “酒吧”|
+-----+ +--------+

现在变量

foo
bar
都指向同一事物,但变量本身仍然是独立且不同的实体,并为它们分配了自己的内存。

© www.soinside.com 2019 - 2024. All rights reserved.