您似乎对malloc()
NULL 的作用和作用有些困惑。
该malloc()
函数分配空间,但不将空间初始化为任何值。from 的返回值malloc()
是指向该空间(的第一个字节)的指针。除非您尝试分配零字节1 ,否则如果它无法分配与您要求的一样多的空间2,则 from 的返回值malloc()
只会是 NULL 。
因此,除非您的系统内存非常不足,否则您的程序不会打印“Hello World”。指针string
将是一个有效的内存位置。
完全未定义的是string
指向的数据。您必须以某种方式对其进行初始化,例如,使用:
strcpy(string, "Hello World");
现在您可以安全地执行以下操作:
printf("%s!\n", string);
在初始化之前,读取内存是不“安全的”;无法保证您会在其中找到什么。您的程序不会崩溃,但所见即所得。
您还可以安全地使用:
if (fgets(string, 500, stdin) != 0)
printf("Read: %s", string);
注意fgets()
为终端预留空间'\0'
;您不必将空间缩小一个。
你问:
我如何检查是否string
已被类似strcpy()
orstrcat()
或 ...
对于大多数实际目的,您无法确定它是否已被修改,因为内存没有定义的内容。如果你真的想知道,你可能会这样做:
char *string_copy = malloc(500);
if (string_copy != NULL)
memmove(string_copy, string, 500);
复制分配的内存的原始内容,然后使用:
if (memcmp(string_copy, string, 500) != 0)
...someone changed either string or string_copy (or both)...
这是相当薄的冰;分配空间中的值没有定义,但在实践中,我会惊讶地发现它不起作用。另一方面,我想不出我会对这种知识感兴趣的情况。如果我分配内存,是为了使用它——通常几乎是立即使用。
1如果您分配零字节,您将获得两种实现定义的行为之一。要么你得到一个返回的 NULL 指针,要么你得到一个有效的、非 NULL 指针,指向与任何其他内存分配不同的零字节可访问内存(因此你不能安全地访问)。无论哪种方式,结果都可以安全地传递给free()
. 如果您分配零字节,则任何通过返回的指针访问内存的尝试都会导致未定义的行为。
2请注意,在Linux上,你可以要求大量内存,malloc()
并声称会为你分配,但你可能会发现,当你访问它时,它根本不可用。