Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 字符串末尾的ENQ_C_String_Posix - Fatal编程技术网

C 字符串末尾的ENQ

C 字符串末尾的ENQ,c,string,posix,C,String,Posix,我的程序中出现了一种奇怪的行为,让我解释一下: 函数如下所示: void PrintDirTree(const char* dirName, size_t depth) 然后我有一个while循环,在这个循环中我遍历目录,为下一个递归调用生成一个新字符串(printName在前面设置为'examplefolder/'): char*newDir=(char*)malloc(strlen(dirName)+strlen(dirEntry->d_name)+1); if(newDir!=0){ m

我的程序中出现了一种奇怪的行为,让我解释一下:

函数如下所示:

void PrintDirTree(const char* dirName, size_t depth)
然后我有一个while循环,在这个循环中我遍历目录,为下一个递归调用生成一个新字符串(printName在前面设置为'examplefolder/'):

char*newDir=(char*)malloc(strlen(dirName)+strlen(dirEntry->d_name)+1);
if(newDir!=0){
memset(newDir,0,sizeof(*newDir));
strcat(newDir,dirName);
if(dirName[strlen(dirName)-1]!='/')){

//printf(“%d\n”,dirName[strlen(dirName)-1]);您正在使用初始化内存

memset(newDir, 0, sizeof(*newDir));

这不会清除整个内存,因为*newDir只是一个字符。当您开始写入数组时,您正在覆盖初始零,因此是伪随机数据。请使用正确的大小清除它,或者使用calloc而不是malloc。

dirName
可能是“”。需要确保在阵列开始之前您不会访问

// if (dirName[strlen(dirName)-1] != '/')
if (dirName[0] && dirName[strlen(dirName)-1] != '/')
malloc()
太小。潜在的
/

顺便问一下:
printName
dirEntry->d_name
有什么关系

// char* newDir = (char*)malloc(strlen(dirName) + strlen(dirEntry->d_name) + 1);
char* newDir = malloc(strlen(dirName) + strlen(printName) + 1 + 1);
@关于初始化,fpw是正确的

// memset(newDir, 0, sizeof(*newDir));
// strcat(newDir, dirName);
strcpy(newDir, dirName);

您是否至少需要strlen(dirName)+strlen(…->d_name)+2?一个字节用于终端“\0”,一个字节用于可能的“/”路径分隔符?
// memset(newDir, 0, sizeof(*newDir));
// strcat(newDir, dirName);
strcpy(newDir, dirName);