【问题标题】:Change the value of the pointer inside a function更改函数内指针的值
【发布时间】:2020-12-06 09:18:42
【问题描述】:

我想将指针的值更改为指向函数内部的不同地址。
我知道我需要一个指向指针的指针来执行此操作,但我犯了一个拼写错误并使用char * 而不是char **,我得到了以下结果。

在函数func中传递指针ptr1地址,指针p变成指向指针地址的指针。
因此,如果我取消引用指针 *p,我将能够更改它指向的值,在这种情况下,指针 ptr1 的(值)。
我知道我无法访问 ptr1 指向的数据(我需要一个 char ** p 参数)。

但如果我的唯一目的是更改ptr1 指向的地址,那在C 中可以接受吗?

#include <stdio.h>

char array1[10] = {'1','2','3','4','5','6','7',};
char array2[10] = {'A','B','C','D','E','F','G',};

void func(char * p)
{
    printf("func is called\n");
    *p = array2;
}

int main(void)
{
    char * ptr1 = NULL;
    ptr1 = array1;

    printf("ptr1 = %s\n", ptr1);
    func(&ptr1);
    printf("ptr1 = %s\n", ptr1);
    return 0;
}

这是我得到的结果。

ptr1 = 1234567
func is called
ptr1 = ABCDEFG

【问题讨论】:

    标签: c function pointers


    【解决方案1】:

    您的代码错误,您(不)幸运地使用错误代码获得了所需的输出。

    函数func根据传递的指针只修改一个字节,因为指针是char*

    您使用的是little-endian环境,array1array2的第一个元素的地址除了最低字节之外恰好相同,所以修改后ptr1的值恰好是正确的只修改一个字节。

    尝试替换

    char array1[10] = {'1','2','3','4','5','6','7',};
    char array2[10] = {'A','B','C','D','E','F','G',};
    

    char array1[256] = {'1','2','3','4','5','6','7',};
    char array2[256] = {'A','B','C','D','E','F','G',};
    

    (改变数组元素的数量)你可能得到另一个结果。如果您未能获得其他结果,请尝试其他尺寸。

    【讨论】:

    • 我很高兴有人说我的代码有误。当我看到这一点时,我同时感到惊讶和沮丧。是的,如果我更改大小,它无法更改指针(它指向相同的地址。但我尝试使用int array,即使我更改数组的大小,我也会得到与以前相同的结果。
    猜你喜欢
    • 2021-08-15
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多