首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果我赋值指针1等于指针2,然后改变指针2,指针1会改变吗?

如果我赋值指针1等于指针2,然后改变指针2,指针1会改变吗?
EN

Stack Overflow用户
提问于 2021-06-09 17:35:12
回答 2查看 43关注 0票数 0

我已经写了下面的函数:

代码语言:javascript
复制
int read_words(char* words[], int size, int max_str_len)
{
    char* pointers = (char*)malloc(max_str_len * sizeof(char) +1);  // the + 1 is for the null 
terminator

    if(pointers==NULL)
    {
         free(pointers);
         return -1;
    }

    int i=0;
    int j=1;

    while((i<size ) && (scanf("%c", & *pointers) != EOF ))
    {


        while(scanf("%c", & *(pointers + j)) != ' ' && j<max_str_len)
        {
            j++;
        }
        *(pointers + j) ='\0';

        words[i] = pointers;
        j=0;
        i++;
    }
    free(pointers);
    return i;

}

它应该读取一串字符串(在C语言中定义为字符数组),并从数组单词中为它们分配指针。(字符串的最大长度为max_str_len)

然后我尝试在下面的循环中使用它:

代码语言:javascript
复制
while(i<num_words)
{
    while(*(words[i]+j) != '\0')
    {
        *(words[i]+j) = encrypt(key, *(words[i]+j));
        j++;
    }
    j=0;

    i++;
}

其中,encrypt获取一个密钥数组,并根据该数组加密它获得的每个字符。

由于某种原因,程序在接收到数组单词的输入后被终止(所以我认为问题出在函数read_words中,我不确定该函数实际上是在扫描单词。

注意:其他试图帮助我使用该函数的人说,我应该扫描整个单词,而不是单个字符,但是该函数的时间复杂度应该是O(size*max_str_len),如果我不将它们作为字符扫描,它将不符合条件。

老实说,我不确定如何使用malloc,我似乎找不到代码的错误。我还有一个关于malloc的一般问题:如果p是某个字节大小的动态分配,arr是一个指针数组:如果p指向一个特定的变量,并且我们定义arr等于p,那么我们将p更改为不同的变量,arr仍然指向第一个变量吗?或者它的值丢失了,现在arr没有指向任何东西或指向新变量?

上面函数的含义:如果我将p定义为:char* p = (char*)malloc(max_atr_len*sizeof(char));

然后我扫描单词,如下所示:scanf(“%s”, & p);

然后我写道:words[i] = p;

如果我扫描一个不同的单词,第一个单词的值是丢失了还是wordsi仍然指向它?

非常感谢您的帮助:)

EN

回答 2

Stack Overflow用户

发布于 2021-06-09 17:40:48

赋值后,两个指针指向相同的数据对象,但您可以自由地将每个指针更改为指向其他地方,而不会影响另一个指针。

票数 0
EN

Stack Overflow用户

发布于 2021-06-09 17:52:12

scanf("%s", p);不会改变p。它改变了p所指向的位置。

words[0] = p;只复制p (地址)的值,没有其他内容。

让我们考虑一下下面的代码片段:

代码语言:javascript
复制
char* p = malloc(...);
scanf("%s", p);
words[0] = p;
scanf("%s", p);
words[1] = p;

p只由第一行改变,因此pwords[0]words[1]都有相同的值:您分配的内存块的地址。

唯一的内存块由第一次调用scanf填充,并被第二次调用scanf覆盖。

代码语言:javascript
复制
words                malloc'ed block
+----------+         +---+---+---+---+---+---+---+--...
|        --------+-->| I | n | p | u | t | 2 | ␀ |
+----------+     |   +---+---+---+---+---+---+---+--...
|        --------+
+----------+     |
                 |
                 |
p                |
+----------+     |
|        --------+
+----------+

现在让我们考虑一下下面的代码片段:

代码语言:javascript
复制
char* p = malloc(...);
scanf("%s", p);
words[0] = p;
p = malloc(...);
scanf("%s", p);
words[1] = p;

  • 的值是您分配的第一个内存块的地址,words[0]的值是您分配的第二个内存块的地址。

第一次调用scanf.

  • The填充了您分配的第一个内存块,第二次调用scanf.

填充了您分配的第二个内存块

代码语言:javascript
复制
words                First malloc'ed block
+----------+         +---+---+---+---+---+---+---+--...
|        ----------->| I | n | p | u | t | 1 | ␀ |
+----------+         +---+---+---+---+---+---+---+--...
|        --------+
+----------+     |   Second malloc'ed block
                 |   +---+---+---+---+---+---+---+--...
                 +-->| I | n | p | u | t | 2 | ␀ |
p                |   +---+---+---+---+---+---+---+--...
+----------+     |
|        --------+
+----------+

顺便说一句,请注意您使用scanf是不安全的。如果输入比您预期的要大,就会发生Bad things

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67901433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档