EDIT:请注意,如果您是这样的话,并不是说我无法访问storeContents()
中main()
分配的内存。 storeContents()
程序在这里失败:
strcpy(contents[count], dir->d_name);
printf("Stored %s(out hiddenVisible)\n", dir->d_name); // for testing
它是strcpy()
而不是printf()
,我添加它只是为了参考。
调试器(gdb)说:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7f3cd72 in __strcpy_ssse3 () from /usr/lib/libc.so.6
我正在制作一个包含以下功能“ storeContents”的程序(它将目录的内容名称存储在动态数组中)。此功能有两个问题:(1)对第一个文件说两次存储的文件名 ,以及(2)说出“ < strong>分段错误”。我不知道他们两个。感谢您的努力!
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <stdlib.h>
#include <sys/types.h>
#include <limits.h>
static short hiddenVisible = 0;
/* Store directory's contents in **contents */
static char ** storeContents(struct dirent *dir, DIR *dirp, unsigned numOfContents);
/* Count files/directories in a directory */
static unsigned getNumOfContents(struct dirent *dir, DIR *dirp);
int main(int argc, char const *argv[])
{
char **contents;
DIR *dirp;
struct dirent *dir;
unsigned numOfContents;
dirp = opendir("/home/gaurav");
if((dir = readdir(dirp)) == NULL) {
perror("readdir");
exit(1);
}
/* Getting number of files/directories */
numOfContents = getNumOfContents(dir, dirp);
printf("There are %u files.\n", numOfContents);
/* To position again to the first entry */
rewinddir(dirp);
contents = storeContents(dir, dirp, numOfContents);
/* Print contents */
for(unsigned i = 0; i < numOfContents; ++i)
printf("%s\n", contents[i]);
closedir(dirp);
return 0;
}
char **
storeContents(struct dirent *dir, DIR *dirp, unsigned numOfContents) {
char **contents;
unsigned count = 0;
/* Allocating memory for entries */
contents = malloc(numOfContents * sizeof(*contents));
/* Allocating memory for each '*contents' */
for(unsigned i = 0; i < numOfContents; i++)
contents[i] = (char *)malloc(NAME_MAX); /* we know char is 1 byte, so no "sizeof" */
while(count < numOfContents) {
/* Ignore "." and ".." */
if(!(strcmp(dir->d_name, ".")) || !(strcmp(dir->d_name, ".."))) {
if((dir = readdir(dirp)) == NULL) {
perror("readdir");
exit(1);
}
continue;
}
if(hiddenVisible) {
strcpy(contents[count], dir->d_name);
if((dir = readdir(dirp)) == NULL) {
perror("readdir");
exit(1);
}
count++;
} else {
if(dir->d_name[0] == '.')
if((dir = readdir(dirp)) == NULL) {
perror("readdir");
exit(1);
}
else {
strcpy(contents[count], dir->d_name);
if((dir = readdir(dirp)) == NULL) {
perror("readdir");
exit(1);
}
count++;
}
}
}
return contents;
}
unsigned
getNumOfContents(struct dirent *dir, DIR *dirp) {
unsigned count = 0;
while(dir) {
if(hiddenVisible) {
/* Ignore "." and ".." */
if(!(strcmp(dir->d_name, ".")) || !(strcmp(dir->d_name, ".."))) {
if((dir = readdir(dirp)) == NULL) {
perror("readdir a");
exit(1);
}
continue;
}
count++;
if((dir = readdir(dirp)) == NULL) {
perror("readdir b");
exit(1);
}
} else {
if(dir->d_name[0] == '.') {
if((dir = readdir(dirp)) == NULL) {
perror("readdir c");
exit(1);
}
}
else {
count++;
if((dir = readdir(dirp)) == NULL) {
perror("readdir d");
exit(1);
}
}
}
}
return count;
}
答案 0 :(得分:1)
一些错误:
contents
是函数的局部参数,它将不会返回给main()。参见Dynamic memory access only works inside function。contents = (char **)malloc(numOfContents);
是错误的,您需要为numOfContents
指针分配空间。将其更改为contents = malloc(numOfContents * sizeof(*contents))
。NULL
。答案 1 :(得分:0)
kubectl get cm istio-sidecar-injector -n istio-system -o yaml | sed -e "s/rewriteAppHTTPProbe: false/grewriteAppHTTPProbe: true/g" | kubectl apply -f -
master $ cat testfile
initialDelaySeconds: [[ annotation .ObjectMeta `readiness.status.sidecar.istio.io/initialDelaySeconds` 1]]
sed -i '/initialDelaySeconds:/c\initialDelaySeconds: 10' testfile
master $ cat testfile
initialDelaySeconds: 10
中的 contents
是storeContents
中contents
的本地副本。
在函数中更改它不会更改main
中的变量。
您应该返回数组。变更
main
到
static void storeContents(struct dirent *dir, DIR *dirp, char **contents, unsigned numOfContents);
,static char **storeContents(struct dirent *dir, DIR *dirp, unsigned numOfContents);
在函数中,然后像return contents;