- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我无法理解 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
。
分配内存的地址(使用 malloc()
)将会丢失。 (这引入了内存泄漏 - 堆中的内存无法通过代码中的任何指针寻址。)
p
现在将指向 string
中的局部变量(对于 for
循环中的每次迭代)。因此之后,strings[10]
的所有条目最终都会指向 string
。
关于c - 使用 strcpy 和等同字符串地址有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56616905/
判断这2个相似的Uris实际上相同的标准方法是什么? var a = new Uri("http://sample.com/sample/"); var b = new Uri("http://sam
这个问题在这里已经有了答案: Why does "true" == true show false in JavaScript? (5 个答案) 关闭 5 年前。 可能我很困惑,但我无法理解这个愚蠢
我是一名优秀的程序员,十分优秀!