新手 C 程序员在使用字符串和 malloc 时遇到麻烦
Novice C programmer having trouble with strings & malloc
我刚开始学习 C 编程,目前正在研究结构并使用指针来处理它们。我一直在尝试编写一个简单的程序来存储您的个人详细信息(姓名和生日)以供练习,但是我在内存分配方面遇到了麻烦而且我显然遗漏了一些东西 - 所以我尝试了一些更简单的东西,显然我'在为字符串分配内存时遇到问题。我已尽力调试它,但我不知道出了什么问题。
#include<stdio.h>
#include<stdlib.h>
#include<stddef.h>
#include<string.h>
int main()
{
char DummyString[100];
printf("Enter a string to be read back to you: ");
scanf("%s",&DummyString);
printf("The string is: %s\n",DummyString);
printf("String length is %d\n",strlen(DummyString));
printf("sizeof char is %i\n",sizeof(char*));
// char DumbStringPtr=&DumbString;
char *DummyStringPtr = (char*)malloc((sizeof(char))*(strlen(DummyString)+1)); // returns 8 regardless of anything
printf("The size of the pointer would be %d\n", sizeof(DummyStringPtr));
}
在原始程序中,失败是在尝试将字符串复制到分配的指针后,我假设这是由于内存不足(如有必要将显示代码)。
我觉得我错过了一些基本的东西,因此非常感谢任何反馈。
如果有人能指出我的错误,我将不胜感激。谢谢!
scanf("%s",&DummyString);
是错误的。由于 DummyString
是一个数组,当您在表达式中使用它时,您会得到一个指向其第一个元素的指针,而这正是 scanf 所期望的。改为 scanf("%s",DummyString);
.
- malloc 行不必要地臃肿,简单地做
char *DummyStringPtr = malloc(strlen(DummyString)+1));
- 无论指向何处,指针的大小始终为 4(或 8 等)。
sizeof
不会告诉你分配了多少内存。如果需要,您必须自己跟踪,在单独的大小变量中。
sizeof
结果的正确 printf 转换说明符是 %zu
,因为 sizeof
returns 类型 size_t
。新手的快速和肮脏的版本是使用 printf("%d", (int)sizeof(something));
- 总是
free(DummyStringPtr);
.
我刚开始学习 C 编程,目前正在研究结构并使用指针来处理它们。我一直在尝试编写一个简单的程序来存储您的个人详细信息(姓名和生日)以供练习,但是我在内存分配方面遇到了麻烦而且我显然遗漏了一些东西 - 所以我尝试了一些更简单的东西,显然我'在为字符串分配内存时遇到问题。我已尽力调试它,但我不知道出了什么问题。
#include<stdio.h>
#include<stdlib.h>
#include<stddef.h>
#include<string.h>
int main()
{
char DummyString[100];
printf("Enter a string to be read back to you: ");
scanf("%s",&DummyString);
printf("The string is: %s\n",DummyString);
printf("String length is %d\n",strlen(DummyString));
printf("sizeof char is %i\n",sizeof(char*));
// char DumbStringPtr=&DumbString;
char *DummyStringPtr = (char*)malloc((sizeof(char))*(strlen(DummyString)+1)); // returns 8 regardless of anything
printf("The size of the pointer would be %d\n", sizeof(DummyStringPtr));
}
在原始程序中,失败是在尝试将字符串复制到分配的指针后,我假设这是由于内存不足(如有必要将显示代码)。 我觉得我错过了一些基本的东西,因此非常感谢任何反馈。 如果有人能指出我的错误,我将不胜感激。谢谢!
scanf("%s",&DummyString);
是错误的。由于DummyString
是一个数组,当您在表达式中使用它时,您会得到一个指向其第一个元素的指针,而这正是 scanf 所期望的。改为scanf("%s",DummyString);
.- malloc 行不必要地臃肿,简单地做
char *DummyStringPtr = malloc(strlen(DummyString)+1));
- 无论指向何处,指针的大小始终为 4(或 8 等)。
sizeof
不会告诉你分配了多少内存。如果需要,您必须自己跟踪,在单独的大小变量中。 sizeof
结果的正确 printf 转换说明符是%zu
,因为sizeof
returns 类型size_t
。新手的快速和肮脏的版本是使用printf("%d", (int)sizeof(something));
- 总是
free(DummyStringPtr);
.