طباعة دليل العمل الحالي في لغة C باستخدام المؤشرات
سؤال
هدف :طباعة دليل العمل الحالي في C على جهاز Linux
بدون استخدام المؤشرات، فإنه يعطي الإخراج الصحيح..
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
int main()
{
//char buf[1024];
char * buf;
char * cwd;
buf = (char *)malloc(sizeof(char) * 1024);
if((cwd = getcwd(buf, sizeof(buf))) != NULL)
printf("pwd : %s\n", cwd);
else
perror("getcwd() error : ");
return 0;
}
ولكن مع المؤشر يظهر الخطأ التالي
getcwd() error : : Numerical result out of range
المحلول
هذا لأنه عندما buf
هو المؤشر، sizeof(buf)
هو عدد البايتات المطلوبة لتخزين أ المؤشر, ، وليس حجم المصفوفة، كما في الكود الذي قمت بالتعليق عليه.
تحتاج إلى تمرير الحجم الذي قمت بتخصيصه (أي.1024) بدلا من ذلك، مثل هذا:
size_t allocSize = sizeof(char) * 1024;
buf = (char *)malloc(allocSize);
if((cwd = getcwd(buf, allocSize)) != NULL) ...
نصائح أخرى
sizeof(buf)
سوف يعود حجم char*
والذي سيكون على الرغم من عدد البتات التي يبلغها معالجك (32 بت أو 64 بت).
ما تريده هو استخدام الرقم السحري الذي حددته، في هذه الحالة 1024.
جرب هذا:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main()
{
//char buf[1024];
char * buf;
char * cwd;
buf = (char *)malloc(sizeof(char) * 1024);
if((cwd = getcwd(buf, 1024)) != NULL)
printf("pwd : %s\n", cwd);
else
perror("getcwd() error : ");
return 0;
}
char *getcwd(char *buf, size_t size);
هنا أنت تعطي الحجم كما sizeof(buf)
والتي سوف ترجع حجم buf
المؤشر الذي سيعتمد على الآلة.
يجب عليك تحديد 1024 في الوسيطة getcwd
.
لا تنتمي إلى StackOverflow