请帮助,疯了,现在已经尝试了8个小时,它永远不会有效。我意识到我可以轻松打印出文件的权限,我已设法做到这一点,但我无法使用此方法返回它。
char *printMode(mode_t mode) {
char *myString = (char *)calloc(11, sizeof(char));
mode_s = ((S_ISDIR(mode)) ? "d" : "-");
strcat(mode_s, ((mode & S_IRUSR) ? "r" : "-"));
strcat(mode_s, ((mode & S_IWUSR) ? "w" : "-"));
strcat(mode_s, ((mode & S_IXUSR) ? "x" : "-"));
strcat(mode_s, ((mode & S_IRGRP) ? "r" : "-"));
strcat(mode_s, ((mode & S_IWGRP) ? "w" : "-"));
strcat(mode_s, ((mode & S_IXGRP) ? "x" : "-"));
strcat(mode_s, ((mode & S_IROTH) ? "r" : "-"));
strcat(mode_s, ((mode & S_IWOTH) ? "w" : "-"));
strcat(mode_s, ((mode & S_IXOTH) ? "x" : "-"));
return myString;
}
答案 0 :(得分:6)
问题在于这两行:
char *mode_s = (char *) calloc(MODE_S_LEN, sizeof(char));
mode_s = ((S_ISDIR(mode)) ? "d" : "-");
第一个使mode_s
指向您分配的内存。下一行指向"d"
或"-"
。你重新指定指针并指向其他地方。
由于您将分配的内存初始化为零,因此您也可以在此使用strcat
。或strcpy
。
答案 1 :(得分:3)
当您添加目录标志时,您将mode_s
重新分配给字符串常量,丢弃已分配的内存。
在这种情况下,您需要使用strcpy
复制字符。
strcpy(mode_s, ((mode & S_ISDIR) ? "d" : "-"));
答案 2 :(得分:0)
您在第一次测试中将mode_s初始化为"d"
或"-"
。随后对strcat()
的调用调用未定义的行为作为字符串文字不应该被修改,并且对strcat()
来说太短了。
您可以通过提高警告级别来避免此类错误:gcc -Wall -W
会告诉您将常量字符串指针存储到常规char *
中。
你的方法效率很低,这是一个更简单,更快捷的选择:
char *printMode(mode_t mode) {
char buf[11];
int i = 0;
buf[i++] = S_ISDIR(mode) ? 'd' : '-';
buf[i++] = (mode & S_IRUSR) ? 'r' : '-';
buf[i++] = (mode & S_IWUSR) ? 'w' : '-';
buf[i++] = (mode & S_IXUSR) ? 'x' : '-';
buf[i++] = (mode & S_IRGRP) ? 'r' : '-';
buf[i++] = (mode & S_IWGRP) ? 'w' : '-';
buf[i++] = (mode & S_IXGRP) ? 'x' : '-';
buf[i++] = (mode & S_IROTH) ? 'r' : '-';
buf[i++] = (mode & S_IWOTH) ? 'w' : '-';
buf[i++] = (mode & S_IXOTH) ? 'x' : '-';
buf[i++] = '\0';
return strdup(buf);
}