【发布时间】:2018-04-08 13:12:56
【问题描述】:
我已经完成了一个将 char 指针传递给其他函数的 MCVE 代码。如果两种传递 char 指针参数的方式相等(str1 和 str2 分别传递到 passingCharPointer1 和 passingCharPointer2 中),我就知道了。
另外,我在代码中包含了 cmets 以及 free/null 函数的行为及其行为(如果它们也被阅读,我将不胜感激)。
代码是:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 50
void passingCharPointer1(char *str) {
strcpy(str, "Hi-1!");
}
void passingCharPointer2(char **str) {
strcpy(*str, "Hi-2!");
}
int main() {
// Init char pointers
char *str1 = malloc((MAX_LENGTH +1)*sizeof(char));
char *str2 = malloc((MAX_LENGTH +1)*sizeof(char));
// Gets their values
printf("Input string 1: ");
fgets(str1, MAX_LENGTH , stdin);
printf("Input string 2: ");
fgets(str2, MAX_LENGTH , stdin);
printf("\n");
// Remove '\n' character
str1[strcspn(str1, "\n")] = '\0';
str2[strcspn(str2, "\n")] = '\0';
// Print their values
printf("BEFORE - Function 1: %s\n", str1);
printf("BEFORE - Function 2: %s\n", str2);
// Pass to function in two ways - ARE BOTH WAYS EQUAL?
passingCharPointer1(str1);
passingCharPointer2(&str2);
// Print their values
printf("AFTER - Function 1: %s\n", str1);
printf("AFTER - Function 2: %s\n", str2);
// Freeing pointers
free(str1);
free(str2);
// Print their values after freeing
printf("\nAFTER FREE 1: %s\n", str1); // Show rare characters (I supposse it is normal behaviour after free)
printf("AFTER FREE 2: %s\n", str2); // Continue having its content (I supposse it is not normal behaviour after free)
// Nulling pointers
str1 = NULL;
str2 = NULL;
// Print their values after nulling
printf("\nAFTER NULL 1: %s\n", str1); // Normal behaviour
printf("AFTER NULL 2: %s\n", str2); // Normal behaviour
// Exit success
return 0;
}
【问题讨论】:
-
问题是什么?打印
free-d 内存是未定义的行为。 -
表达式:
sizeof(char)在 C 标准中定义为 1。乘以 1 无效。调用malloc()函数的参数被这些表达式弄乱了。建议从对malloc()的调用中删除这些表达式 -
在调用任何堆分配函数时:
malloccallocrealloc,始终检查 (!=NULL) 返回值以确保操作正常 -
@s7amuser 是的,好的,谢谢。但是,一个显示内容而另一个不显示内容是正常的,对吧?
-
发布的代码包含一些“神奇”数字。 “魔术”数字是没有基础的数字。 IE。 50. 'magic' numbers 使代码更难理解和调试。建议使用
#define语句或enum语句为这些“神奇”数字赋予有意义的名称,然后在整个代码中使用这些有意义的名称。