【问题标题】:memcpy copies array object to character pointer in C but not vice versamemcpy 将数组对象复制到 C 中的字符指针,反之亦然
【发布时间】:2015-12-13 05:18:40
【问题描述】:

我正在尝试通过函数将字符从数组复制到字符指针。以下是我的代码:

#include<stdio.h>
void pass(void* arg){
    char arr[1];
    arr[0]='X';
    memcpy((char *)arg,arr,1);
}

void main(){
    char *buf=malloc(sizeof(char));
    pass(buf);
    printf("%c",buf);
    free(buf);
}

这里,指针buf 打印一个垃圾值。我尝试了上述程序的反向如下:

#include<stdio.h>
void pass(void* arg){
    char arr[1];
    memcpy(arr,(char *)arg,1);
    printf("%c",arr[0]);
}

void main(){
    char *buf=malloc(sizeof(char));
    buf[0]='X';
    pass(buf);
    free(buf);
}

这是成功的,arr[0] 将值打印为 X。 有人能解释一下为什么第一个案例会失败吗?

【问题讨论】:

  • 将警告旋钮调高一个档次。

标签: c arrays pointers memory memcpy


【解决方案1】:

您必须打印*bufbuf[0] 而不是buf 才能打印buf 指向的数组的第一个元素。

另请注意,由于类型不匹配,将类型为char* 的数据传递给printf() 以通过%c 打印(预期数据类型为int)是未定义的行为

试试这个:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void pass(void* arg){
  char arr[1];
  arr[0]='X';
  memcpy((char *)arg,arr,1);
}
int main(void){
  char *buf=malloc(sizeof(char));
  pass(buf);
  printf("%c",buf[0]);
  free(buf);
  return 0;
}

【讨论】:

    【解决方案2】:

    你的问题在这里:

    char *buf=malloc(sizeof(char));
    :
    printf("%c",buf);
    

    因为buf 是一个指针 指向一个字符,而不是一个字符。 字符*buf,或buf[0],所以你可以用:

    printf ("%c", *buf);
    

    顺便说一句,完全没有必要在第一个示例中创建 arr 并调用 memcpy,而您可以这样做:

    void pass (void* arg) {
        ((char*)arg)[0] = 'X';
    }
    

    在这种情况下,当您可以将malloc 行替换为简单的行时,也不需要为字符动态分配内存:

    char buf[1];
    

    (当然要去掉 free 行)。

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 2011-02-03
      • 2011-06-24
      • 1970-01-01
      • 2018-08-15
      相关资源
      最近更新 更多