【问题标题】:Assign a char pointer the value of another char pointer为一个 char 指针分配另一个 char 指针的值
【发布时间】:2020-11-30 23:48:22
【问题描述】:

我有两个 char 指针:

char *temp;
char *saveAlias;

我想将saveAlias 分配给temp 中存储的任何内容; saveAlias 当前为空,而 temp 从用户输入中保存了一个未知大小的字符串。 请注意,我不希望 saveAlias 指向 temp 指向的位置;我想要temp 的内容并将其分配(指向)saveAlias

我曾尝试使用strcatstrcpy,但无济于事。

【问题讨论】:

  • 您似乎无法区分指针和它们指向的对象,至少在您的措辞中如此。您可以通过赋值运算符 (=) 分配 saveAlias 以指向与 temp 相同的对象。另一方面,如果您想复制temp 指向的数据,那么您首先需要saveAlias 指向一个足够大的可修改对象,这绝不是自动的。目前还不清楚您到底想做什么以及您正在尝试什么;如需更具体的帮助,我们需要您提供演示代码,而不仅仅是声明。
  • 更正:您有两个 未初始化 字符指针,它们当前保存(例如指向)不确定的地址作为它们的值。在它们提供有效的内存地址之前,您几乎可以对它们做任何事情。

标签: c pointers char


【解决方案1】:

假设您的temp 变量指向一个字符串,该字符串适合以nul 结尾(作为C 中的字符串应该),那么您可以只使用strdup() function 来制作它的副本并将指向它的指针存储在saveAlias 中。这个函数将duplicate给定的string到新分配的内存中;当不再需要时,应该使用free 函数释放该内存:

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

int main()
{
    char* temp = "source string";
    char* saveAlias = strdup(temp);
    printf("Temp is <%s> (at %p).\n", temp, (void*)temp);
    printf("Alias is <%s> (at %p).\n", saveAlias, (void*)saveAlias);
    free(saveAlias);
    return 0;
}

strdup 函数有效地将mallocstrcpy 组合成一个函数调用,上面显示的调用相当于:

    char* saveAlias = malloc(strlen(temp) + 1);
    strcpy(saveAlias, temp);

【讨论】:

    【解决方案2】:

    如果要为temp 当前指向的字符串的副本分配内存,请使用strdup()

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char buf[128];
        char *temp;
        char *saveAlias = NULL;
    
        if ((temp = fgets(buf, sizeof buf, stdin)) != NULL) {
            saveAlias = strdup(temp);
            if (saveAlias == NULL) {
                fprintf(stderr, "allocation failed\n");
            } else {
                printf("saveAlias: %s\n", saveAlias);
            }
        }
        free(saveAlias);
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      您基本上可以将 saveAlias 指向 temp;因此,您将拥有:

      saveAlias = temp;

      正如克里斯所说。这将使一个指针指向另一个。 更正我的回答。我建议你用 malloc 定义 saveAlias 的大小,然后使用 memcpy 函数。您将拥有:

      #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
        
      int main(){    
         char *temp = "your_char";
      
         //with malloc you make sure saveAlias will have the same size as temp
         //and then we add one for the NULL terminator
         char *saveAlias = (char*) malloc(strlen(temp) + 1);
                  
         //then just                                                                                                                                            
         strcpy(saveAlias, temp);
       
         printf("%s\n", temp);
         printf("%s", saveAlias);
         return 0;            
      }
      

      也感谢chqrlie 的解释。我弄错了 memcpy。

      【讨论】:

      • 这不会将 saveAlias 指向 temp —— 它会将 saveAlias 指向任何 temp 指向的位置。一个重要的区别。
      • 你在 memcpy 中使用了sizeof(temp)。为什么不尝试将字符串从 "your_char" 更改为 "your_char_test_long" 看看会发生什么
      • 为什么会发生溢出,您介意解释一下吗? @mr.loop 我已经测试过了,memcpy 复制了这个值并在另一个指针中覆盖它。
      • 分配大小不正确,必须为空终止符添加一个:char *saveAlias = (char*) malloc(strlen(temp) + 1);memcpy 的有效大小,只需使用strcpy(saveAlias, temp); 或更好地使用strdup()char *saveAlias = strdup(temp);
      • @chqrlie 如果我们使用strlen(temp)strlen(temp)+1,没有任何变化。重要的是 sizeof(temp) 是一个 8 字节的常量值,因此 memcpy 并没有复制更多。
      猜你喜欢
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 2018-08-15
      • 2018-04-05
      • 2011-05-23
      • 2015-10-26
      • 2011-08-10
      • 2023-03-26
      相关资源
      最近更新 更多