- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一个脚本,这意味着在将 PostScript 文件转换为 pdf 文件之前将文本放在末尾。
int main(int argc, char *argv[]){
// Déclaration des variables
// Fichier source
char *source;
// Extension du fichier source
char *extension;
// Fichier de parametre
char *fichierPar;
// Numero et Type de folio du fichier
char *numeroFolio;
char *typeFolio;
// Tableaux contenant les types de folio a scanner
// suivant le numero de folio
char **t_F000 = NULL;
// Allocation des espaces mémoires nécessaires aux variables
source = malloc(sizeof(char) * strlen(argv[1]));
fichierPar = malloc(sizeof(char) * strlen(argv[2]));
extension = malloc(sizeof(char) * 5);
typeFolio = malloc(sizeof(char) * 4);
numeroFolio = malloc(sizeof(char) * 4);
// Grille de parametre
// AJUSTER LA TAILLE DU TABLEAU AVEC LE FICHIER DE LOGO.PAR
// DANS verification.h
Grille t_Grilles[NBGRILLE];
// On copie les arguments dans des varibles plus explicites
strcpy(source, argv[1]);
strcpy(fichierPar, argv[2]);
// GetFolio appel getNumeroFolio qui appel getTypeFolio
// Ces deux fonctions extraient du nom de fichier
// le numero et le type de folio
getFolio(source, numeroFolio, typeFolio);
printf("strlen : %d\n", strlen(numeroFolio));
fflush(stdout);
printf("numero : %s\n", numeroFolio);
fflush(stdout);
// Lecture du fichier LOGO.PAR et enregistrement en mémoire
chargerGrilles(fichierPar, t_Grilles);
printf("bonjour\n");
fflush(stdout);
printf("strlen : %d\n", strlen(numeroFolio));
fflush(stdout);
printf("numero : %s", numeroFolio);
fflush(stdout);
工作并不止于此,但我正在阻止这一点。
这是 ChargerGrille() 的代码;
void chargerGrilles(char *fichierPar, Grille t_Grilles[]){
FILE *fdParam;
char *ligne;
Grille *grille;
int inc = 0;
grille = malloc(sizeof(Grille));
ligne = malloc(sizeof(char) * 100);
fdParam = fopen(fichierPar, "rb");
verifierOuverture(fdParam, fichierPar);
while(fgets(ligne, 100, fdParam)){
if(verifierCommentaire(ligne) != 0){
remplirGrille(grille, ligne);
t_Grilles[inc] = *grille;
inc++;
}
}
fclose(fdParam);
}
void remplirGrille(Grille *grille, char *ligne){
char *split;
// Separation sur les espaces
split = malloc(strlen(ligne));
split = strtok(ligne, " ");
strcpy(grille->nom, split);
split = NULL;
free(split);
split = malloc(strlen(ligne));
split = strtok(NULL, " ");
grille->posX = strtof(split, NULL);
split = NULL;
free(split);
split = malloc(strlen(ligne));
split = strtok(NULL, " ");
grille->posY = strtof(split, NULL);
split = NULL;
free(split);
split = malloc(strlen(ligne));
split = strtok(NULL, " ");
grille->longX = strtof(split, NULL);
split = NULL;
free(split);
split = malloc(strlen(ligne));
split = strtok(NULL, " ");
grille->hautY = strtof(split, NULL);
split = NULL;
free(split);
split = malloc(strlen(ligne));
split = strtok(NULL, " ");
strcpy(grille->logo, split);
split = NULL;
free(split);
printf("Hello World !\n");
fflush(stdout);
}
这是我的结构声明:
struct Grille{
// Nom du tableau
char nom[4];
// Position du point inferieur gauche
long int posX;
long int posY;
// Longueur X
long int longX;
// HAUTEUR Y
long int hautY;
// Nom du fichier logo.jpg
char logo[50];
};
typedef struct Grille Grille;
在 gdb 中,我可以在调用 chargerGrilles(fichierPar, t_Grilles) 之前打印“source”、“extension”、“fichierPar”、“numeroFolio”和“typeFolio”;之后它将无法访问。
108 chargerGrilles(fichierPar, t_Grilles);
(gdb) print source
$7 = 0x604010 "F290390001_SCH001-2.POS"
(gdb) print numeroFolio
$8 = 0x604090 "001"
(gdb) n
Hello World !
Hello World !
Hello World !
Hello World !
110 printf("bonjour\n");
(gdb) n
bonjour
111 fflush(stdout);
(gdb) print source
$9 = 0x303732 <error: Cannot access memory at address 0x303732>
(gdb) print numeroFolio
$10 = 0x53 <error: Cannot access memory at address 0x53>
如果我在 numeroFolio 上放一个 watch ,gdb 会在这一行停止:
t_Grilles[inc] = *grille;
分配的内存发生了什么?为什么变量的地址会改变?
PS:不要管很多 printf/fflush,这是我试图找出 segFault 位置的方式
最佳答案
您面临的问题可能是由于越界访问 t_Grilles
数组到 chargerGrilles
函数引起的。使用 index > NBGRILLE
访问它会调用 Undefined Behavior并且,在您的情况下,会破坏其他主要的局部范围变量。
您必须确保循环 while(fgets(ligne, 100, fdParam))
处理 t_Grilles
大小。
所以解决方案可以是:
while((fgets(ligne, 100, fdParam)) && (inc <NBGRILLE)) {
if(verifierCommentaire(ligne) != 0){
remplirGrille(grille, ligne);
t_Grilles[inc] = *grille;
inc++;
}
}
在我看来,最好的方法是向函数添加一个参数来传递数组大小。
void chargerGrilles(char *fichierPar, Grille t_Grilles[], size_t size)
{
FILE *fdParam;
char *ligne;
Grille *grille;
size_t inc = 0;
grille = malloc(sizeof(Grille));
ligne = malloc(sizeof(char) * 100);
if ((grille != NULL) && (ligne != NULL))
{
fdParam = fopen(fichierPar, "rb");
verifierOuverture(fdParam, fichierPar);
while((fgets(ligne, 100, fdParam)) && (inc < size)){
if(verifierCommentaire(ligne) != 0){
remplirGrille(grille, ligne);
memcpy(&t_Grilles[inc], grille, sizeof(Grille));
inc++;
}
}
}
free(ligne);
free(grille);
fclose(fdParam);
}
并调用它
chargerGrilles(fichierPar, t_Grilles, sizeof(t_Grilles)/sizeof(t_Grilles[0]));
如您所见,我还添加了对 malloc
变量的检查。您总是必须检查malloc
返回值。否则你可以调用 Undefined Behavior .
最后,您必须释放
malloc
内存,否则您将看到内存泄漏。
关于c - 分配的变量不可访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38219585/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!