C动态内存分配
C dynamic memory allocation
我正在学习C,但我还是菜鸟。
我正在编写一个程序作为动态内存分配的练习,该程序从用户那里获取长度未知的文本,并在没有空格、制表符、特殊字符或数字的情况下返回该文本。
该程序似乎运行良好,只是某些文本似乎由于未知原因更改为未知字符。
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *pstring;
pstring = (char *)malloc( sizeof(char));
char c = '$';
int i = 0;
while(c != '\n')
{
c = getchar();
if(isalpha(c))
{
pstring[i] = c;
realloc(pstring, (i+2)*sizeof(char));
i++;
}
}
int j;
for(j = 0; j < i; j++)
{
printf("%c", pstring[j]);
}
return 0;
}
工作正常:
问题是:
realloc
函数可以扩展现有的内存,但是它也可以(而且可能大部分时间都这样做)完全分配新的 内存。它 returns 它重新分配的内存,并且您不使用那个 returned 指针。
此外,如果 realloc
失败,那么它将 return NULL
,所以不要将 returned 指针分配给您在 realloc
调用,否则你将失去原来的指针。使用临时变量,并检查 NULL
,然后重新分配给实际的指针变量。
在一个不相关的注释中,sizeof(char)
被指定为始终 1
。
最后一句警告。你现在处理 "string" 的方式工作正常(在解决你现在或当然遇到的问题之后),但是如果你想将数据视为 "proper" C 字符串,你需要分配一个额外的字符,因为 C 字符串以空字符终止,'[=17=]'
(不要与空指针混淆,NULL
)。
如果您的字符串没有此终止符,使用任何标准字符串函数都会导致未定义的行为,因为它很可能会超出分配的内存范围。
正如 Joachim Pileborg 所说,realloc 可能会将内存块移动到新位置,我们应该将指针更改为该新位置
Here is useful link about realloc function
我现在的工作代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *pstring, *ptemp;
pstring = (char *)malloc( sizeof(char));
char c = '$';
int i = 0;
while(c != '\n')
{
c = getchar();
if(isalpha(c))
{
pstring[i] = c;
ptemp = realloc(pstring, (i+2)*sizeof(char));
if(ptemp != NULL)
{
pstring = ptemp;
i++;
}
}
}
int j;
for(j = 0; j < i; j++)
{
printf("%c", pstring[j]);
}
return 0;
}
我正在学习C,但我还是菜鸟。 我正在编写一个程序作为动态内存分配的练习,该程序从用户那里获取长度未知的文本,并在没有空格、制表符、特殊字符或数字的情况下返回该文本。 该程序似乎运行良好,只是某些文本似乎由于未知原因更改为未知字符。 这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *pstring;
pstring = (char *)malloc( sizeof(char));
char c = '$';
int i = 0;
while(c != '\n')
{
c = getchar();
if(isalpha(c))
{
pstring[i] = c;
realloc(pstring, (i+2)*sizeof(char));
i++;
}
}
int j;
for(j = 0; j < i; j++)
{
printf("%c", pstring[j]);
}
return 0;
}
工作正常:
问题是:
realloc
函数可以扩展现有的内存,但是它也可以(而且可能大部分时间都这样做)完全分配新的 内存。它 returns 它重新分配的内存,并且您不使用那个 returned 指针。
此外,如果 realloc
失败,那么它将 return NULL
,所以不要将 returned 指针分配给您在 realloc
调用,否则你将失去原来的指针。使用临时变量,并检查 NULL
,然后重新分配给实际的指针变量。
在一个不相关的注释中,sizeof(char)
被指定为始终 1
。
最后一句警告。你现在处理 "string" 的方式工作正常(在解决你现在或当然遇到的问题之后),但是如果你想将数据视为 "proper" C 字符串,你需要分配一个额外的字符,因为 C 字符串以空字符终止,'[=17=]'
(不要与空指针混淆,NULL
)。
如果您的字符串没有此终止符,使用任何标准字符串函数都会导致未定义的行为,因为它很可能会超出分配的内存范围。
正如 Joachim Pileborg 所说,realloc 可能会将内存块移动到新位置,我们应该将指针更改为该新位置
Here is useful link about realloc function 我现在的工作代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *pstring, *ptemp;
pstring = (char *)malloc( sizeof(char));
char c = '$';
int i = 0;
while(c != '\n')
{
c = getchar();
if(isalpha(c))
{
pstring[i] = c;
ptemp = realloc(pstring, (i+2)*sizeof(char));
if(ptemp != NULL)
{
pstring = ptemp;
i++;
}
}
}
int j;
for(j = 0; j < i; j++)
{
printf("%c", pstring[j]);
}
return 0;
}