gpt4 book ai didi

c - 使用 strcpy 和等同字符串地址有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:21 28 4
gpt4 key购买 nike

我无法理解 strcpy 函数与使用指针使字符串地址相等的方法之间的区别。下面给出的代码将使我的问题更加清楚。任何帮助将不胜感激。

//code to take input of strings in an array of pointers
#include <stdio.h>
#include <strings.h>
int main()
{
//suppose the array of pointers is of 10 elements
char *strings[10],string[50],*p;
int length;
//proper method to take inputs:
for(i=0;i<10;i++)
{
scanf(" %49[^\n]",string);
length = strlen(string);
p = (char *)malloc(length+1);
strcpy(p,string);//why use strcpy here instead of p = string
strings[i] = p; //why use this long way instead of writing directly strcpy(strings[i],string) by first defining malloc for strings[i]
}
return 0;
}

最佳答案

指针魔法的简短介绍:

char *strings[10],string[50],*p;

这是三个具有不同类型的变量:

char *strings[10]; // an array of 10 pointers to char
char string[50]; // an array of 50 char
char *p; // a pointer to char

然后完成以下操作(10 次):

    scanf(" %49[^\n]",string);

考虑到 0 终止符也必须适合,从输入中读取 C 字符串并将其存储到 string 中。

    length = strlen(string);

对非 0 字符进行计数,直到找到 0 终止符并将其存储在 length 中。

    p = (char *)malloc(length+1);

在堆上分配长度为 1 的内存(对于 0 终止符),并将该内存的地址存储在 p 中。 (malloc() 可能会失败。检查 if (p != NULL) 不会造成伤害。)

    strcpy(p,string);//why use strcpy here instead of p = string

string中的C字符串复制到p中指向的内存中。 strcpy() 复制直到在源中找到(含)0 终止符。

    strings[i] = p;

p(指向内存的指针)分配给strings[i]。 (赋值后strings[i]指向与p相同的内存。赋值是指针赋值,而不是指向值的赋值。)


为什么 strcpy(p,string); 而不是 p = string:

后者会将string(局部变量,可能存储在堆栈中)的地址分配给p

  1. 分配内存的地址(使用 malloc())将会丢失。 (这引入了内存泄漏 - 堆中的内存无法通过代码中的任何指针寻址。)

  2. p 现在将指向 string 中的局部变量(对于 for 循环中的每次迭代)。因此之后,strings[10] 的所有条目最终都会指向 string

关于c - 使用 strcpy 和等同字符串地址有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56616905/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com